Argmax tablicy numpy zwracającej niepłaskie indeksy


100

Próbuję uzyskać indeksy maksymalnego elementu w tablicy Numpy. Można to zrobić za pomocą numpy.argmax. Mój problem polega na tym, że chciałbym znaleźć największy element w całej tablicy i uzyskać jego indeksy.

numpy.argmax można zastosować albo wzdłuż jednej osi, co nie jest tym, czego chcę, lub na spłaszczonej tablicy, co jest tym, czego chcę.

Mój problem polega na tym, że użycie numpy.argmaxwith axis=Nonezwraca indeks płaski, gdy chcę indeks wielowymiarowy.

Przydałby divmodmi się indeks niepłaski, ale to brzydkie. Czy jest lepszy sposób na zrobienie tego?

Odpowiedzi:



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

zwraca współrzędne maksymalnej liczby elementów, ale musi dwukrotnie przeanalizować tablicę.

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

To, w porównaniu z argmax, zwraca współrzędne wszystkich elementów równe maksimum. argmaxzwraca tylko jedną z nich ( np.ones(5).argmax()zwraca 0).


10
Spowoduje to trzykrotne powtórzenie tablicy, a nie tylko dwukrotne. Raz, aby znaleźć maksimum, drugi raz, aby zbudować wynik ==i trzeci raz, aby wyodrębnić Truewartości z tego wyniku. Zauważ, że może istnieć więcej niż jeden element równy maksimum.
Sven Marnach

1

Aby uzyskać niepłaski indeks wszystkich wystąpień maksymalnej wartości, możesz nieznacznie zmodyfikować odpowiedź eumiro, używając argwherezamiast 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]])

To nie jest skuteczne, ponieważ otrzymujesz trzy przebiegi i tworzenie matrycy. Wyobraź sobie, że mamy obraz 9000x7000 (A3 przy 600 dpi) - czy nadal nalegasz na swoje rozwiązanie?
Maksym Ganenko
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.