2012-02-28 61 views
52

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 yếu tố lớn nhất trong toàn bộ mảng và nhận được các chỉ số về điều đó.Argmax mảng numpy trả về các chỉ số không phẳng

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à sử dụng numpy.argmax với axis=None trả 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 để nhận chỉ mục không bằng phẳng nhưng điều này có vẻ xấu. Có cách nào tốt hơn để làm điều này?

Trả lời

90

Bạn có thể sử dụng numpy.unravel_index() trên 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 
16
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 với argmax, trả về tọa độ của tất cả các phần tử bằng với mức tối đa. argmax chỉ trả về một trong số họ (np.ones(5).argmax() trả về 0).

+5

này sẽ lặp 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ả của '==', và lần thứ ba để trích xuất các giá trị 'True' từ kết quả này. Lưu ý rằng có thể có nhiều mục bằng mức tối đa. –

Các vấn đề liên quan