Nhận vị trí của giá trị lớn nhất trong mảng NumPy đa chiều


81

Làm cách nào để tôi có được vị trí (chỉ số) của giá trị lớn nhất trong mảng NumPy đa chiều?


Trong trường hợp có nhiều vị trí có giá trị lớn như nhau, bạn cần tất cả hay chỉ vị trí đầu tiên (hoặc cuối cùng hoặc chỉ bất kỳ)?
Trilarion

Câu trả lời:


176

Các argmax()phương pháp sẽ giúp.

Cập nhật

(Sau khi đọc bình luận) Tôi tin rằng argmax()phương pháp này cũng sẽ hoạt động cho các mảng đa chiều. Tài liệu được liên kết đưa ra một ví dụ về điều này:

>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3

Cập nhật 2

(Cảm ơn bình luận của KennyTM ) Bạn có thể sử dụng unravel_index(a.argmax(), a.shape)để lấy chỉ mục dưới dạng một tuple:

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)

1
Nhưng tôi có một mảng đa chiều.
kame

85
Sử dụng unravel_index(a.argmax(), a.shape)để lấy chỉ mục dưới dạng một tuple.
kennytm

số 3 có nghĩa là gì? Được rồi, tôi hiểu rồi. Tôi đã tìm kiếm (1,0).
kame

2
có thực sự cần là một built-in chức năng để nhận được giá trị như một tuple
endolith


6

(sửa) Tôi đang đề cập đến một câu trả lời cũ đã bị xóa . Và câu trả lời được chấp nhận đã đến sau tôi. Tôi đồng ý rằng argmaxtốt hơn câu trả lời của tôi.

Làm như thế này sẽ không dễ đọc / trực quan hơn phải không?

numpy.nonzero(a.max() == a)
(array([1]), array([0]))

Hoặc là,

numpy.argwhere(a.max() == a)

4
Không cần thiết phải chậm, bởi vì bạn tính toán giá trị lớn nhất và sau đó so sánh nó với tất cả a. unravel_index (a.argmax (), a.shape).
Peter

Tôi đã bỏ phiếu cho điều này vì nó không giả định gì về số lần xuất hiện của a.max () trong a. Trong khi a.argmax () sẽ trả về lần xuất hiện "đầu tiên" (không được xác định rõ trong trường hợp mảng nhiều chiều vì nó phụ thuộc vào sự lựa chọn của đường truyền). docs.scipy.org/doc/numpy/reference/generated/… Tôi cũng nghĩ rằng np.where () là một lựa chọn tự nhiên / dễ đọc hơn là np.nonzero ().
FizxMike

2

Bạn có thể chỉ cần viết một hàm (chỉ hoạt động trong 2d):

def argmax_2d(matrix):
    maxN = np.argmax(matrix)
    (xD,yD) = matrix.shape
    if maxN >= xD:
        x = maxN//xD
        y = maxN % xD
    else:
        y = maxN
        x = 0
    return (x,y)

0

Một cách khác là thay đổi numpymảng thành listvà sử dụng maxindexcác phương thức:

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.