Argmax của mảng numpy trả về các chỉ số không phẳng


99

Tôi đang cố gắng lấy các chỉ số của phần tử tối đa trong một mảng Numpy. Điều này có thể được thực hiện bằng cách sử dụng numpy.argmax. Vấn đề của tôi là tôi muốn tìm phần tử lớn nhất trong toàn bộ mảng và lấy các chỉ số của phần tử đó.

numpy.argmax có thể được áp dụng dọc theo một trục, không phải là những gì tôi muốn, hoặc trên mảng phẳng, đó là loại những gì tôi muốn.

Vấn đề của tôi là việc sử dụng numpy.argmaxvới axis=Nonetrả về chỉ mục phẳng khi tôi muốn chỉ mục đa chiều.

Tôi có thể sử dụng divmodđể có được một chỉ số không phẳng nhưng điều này cảm thấy xấu xí. Có cách nào tốt hơn để làm điều này không?

Câu trả lời:


169

Bạn có thể sử dụng numpy.unravel_index()kết quả của numpy.argmax():

>>> a = numpy.random.random((10, 10))
>>> numpy.unravel_index(a.argmax(), a.shape)
(6, 7)
>>> a[6, 7] == a.max()
True

21
np.where(a==a.max())

trả về tọa độ của (các) phần tử tối đa, nhưng phải phân tích cú pháp mảng hai lần.

>>> a = np.array(((3,4,5),(0,1,2)))
>>> np.where(a==a.max())
(array([0]), array([2]))

Điều này, so sánh với argmax, trả về tọa độ của tất cả các phần tử bằng giá trị lớn nhất. argmaxchỉ trả về một trong số chúng ( np.ones(5).argmax()trả về 0).


10
Điều này sẽ lặp lại mảng ba lần, không chỉ hai lần. Một lần để tìm giá trị lớn nhất, lần thứ hai để xây dựng kết quả ==và lần thứ ba để trích xuất các Truegiá trị từ kết quả này. Lưu ý rằng có thể có nhiều hơn một mục bằng số lượng tối đa.
Sven Marnach

1

Để nhận được chỉ số không phẳng của tất cả các lần xuất hiện có giá trị lớn nhất, bạn có thể sửa đổi một chút câu trả lời của eumiro bằng cách sử dụng argwherethay vì where:

np.argwhere(a==a.max())

>>> a = np.array([[1,2,4],[4,3,4]])
>>> np.argwhere(a==a.max())
array([[0, 2],
       [1, 0],
       [1, 2]])

Nó không hiệu quả vì bạn nhận được ba đường chuyền và tạo ma trận. Hãy tưởng tượng chúng ta có hình ảnh 9000x7000 (A3 @ 600dpi) - bạn vẫn nhấn mạnh vào giải pháp của mình chứ?
Maksym Ganenko
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.