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?

Andreas Mueller
źródło

Odpowiedzi:

174

Możesz użyć numpy.unravel_index()na wyniku numpy.argmax():

>>> a = numpy.random.random((10, 10))
>>> numpy.unravel_index(a.argmax(), a.shape)
(6, 7)
>>> a[6, 7] == a.max()
True
Sven Marnach
źródło
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).

eumiro
źródło
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]])
Richard Ludlow
źródło
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