Jak uzyskać indeks maksymalnego elementu w tablicy numpy wzdłuż jednej osi

118

Mam dwuwymiarową tablicę NumPy. Wiem, jak uzyskać maksymalne wartości na osiach:

>>> a = array([[1,2,3],[4,3,1]])
>>> amax(a,axis=0)
array([4, 3, 3])

Jak mogę uzyskać wskaźniki maksymalnych elementów? Więc chciałbym jako wyjściearray([1,1,0])

Peter Smit
źródło

Odpowiedzi:

142
>>> a.argmax(axis=0)

array([1, 1, 0])
eumiro
źródło
1
działa to dobrze w przypadku liczb całkowitych, ale co mogę zrobić dla wartości zmiennoprzecinkowych i liczb od 0 do 1
Priyom saha
100
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,3,1]])
>>> i,j = np.unravel_index(a.argmax(), a.shape)
>>> a[i,j]
4
blaz
źródło
11
Zauważ, że ta odpowiedź jest myląca. Oblicza indeks maksymalnego elementu tablicy na wszystkich osiach, a nie wzdłuż danej osi, jak pyta PO: jest źle. Ponadto, jeśli jest więcej niż jedno maksimum, pobiera indeksy tylko pierwszego maksimum: należy to zaznaczyć. Spróbuj, a = np.array([[1,4,3],[4,3,1]])aby zobaczyć, że powraca i,j==0,1i pomija rozwiązanie w i,j==1,0. Dla wskaźników wszystkich maksimów użyj zamiast tego i,j = where(a==a.max().
gg349
36

argmax()zwróci tylko pierwsze wystąpienie dla każdego wiersza. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Jeśli kiedykolwiek będziesz musiał to zrobić dla tablicy shape, działa to lepiej niż unravel:

import numpy as np
a = np.array([[1,2,3], [4,3,1]])  # Can be of any shape
indices = np.where(a == a.max())

Możesz także zmienić swoje warunki:

indices = np.where(a >= 1.5)

Powyższe daje wyniki w postaci, o którą prosiłeś. Alternatywnie możesz przekonwertować na listę współrzędnych x, y przez:

x_y_coords =  zip(indices[0], indices[1])
SevakPrime
źródło
2
To nie zadziałało ... Masz na myśli indices = np.where(a==a.max())w linii 3?
atomh33ls
Masz rację, atomh33ls! Dzięki, że to zauważyłeś. Naprawiłem to stwierdzenie, aby zawierało drugi znak równości dla właściwego warunku.
SevakPrime
@SevakPrime, wystąpił drugi błąd wskazany przez @ atomh33ls .max()zamiast .argmax(). Edytuj odpowiedź
gg349
@ gg349, to zależy od tego, czego chcesz. argmax dostarcza je wzdłuż osi, która wydaje się być zgodna z oczekiwaniami PO, po zatwierdzeniu tej odpowiedzi przez eumiro.
SevakPrime
Widzę, że korekta @ atomh33ls i proponuję prowadzi do indeksu największego elementu (ów) tablicy, podczas gdy OP pyta o największe elementy wzdłuż określonej osi. Zwróć jednak uwagę, że obecne rozwiązanie prowadzi dox_y_coord = [(0, 2), (1, 1)] tego, że NIE pasuje do odpowiedzi @eumiro i jest błędne. Na przykład spróbuj z, a = array([[7,8,9],[10,11,12]])aby zobaczyć, że twój kod nie ma żadnego trafienia na to wejście. unravelWspomniałeś również, że działa to lepiej niż , ale rozwiązanie opublikowane przez @blas rozwiązuje problem absolutnego maksimum, a nie przesuwania się wzdłuż jednej osi.
gg349
3
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
ahmed
źródło