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])
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])
Odpowiedzi:
>>> 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
a = np.array([[1,4,3],[4,3,1]])
aby zobaczyć, że powraca i,j==0,1
i 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()
.
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])
indices = np.where(a==a.max())
w linii 3?
.max()
zamiast .argmax()
. Edytuj odpowiedź
x_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. unravel
Wspomniał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.