So ermitteln Sie den Index eines maximalen Elements in einem Numpy-Array entlang einer Achse

118

Ich habe ein zweidimensionales NumPy-Array. Ich weiß, wie man die Maximalwerte über Achsen erhält:

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

Wie kann ich die Indizes der maximalen Elemente erhalten? Also ich möchte als Ausgabearray([1,1,0])

Peter Smit
quelle

Antworten:

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

array([1, 1, 0])
Eumiro
quelle
1
Dies funktioniert gut für ganze Zahlen, aber was kann ich für Float-Werte und die Zahlen zwischen 0 und 1
tun
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
quelle
11
Beachten Sie, dass diese Antwort irreführend ist. Es berechnet den Index des maximalen Elements des Arrays über alle Achsen und nicht entlang einer bestimmten Achse, wenn das OP fragt: Es ist falsch. Wenn es mehr als ein Maximum gibt, werden außerdem nur die Indizes des ersten Maximums abgerufen. Dies sollte hervorgehoben werden. Versuchen Sie mit, um a = np.array([[1,4,3],[4,3,1]])zu sehen, dass es zurückkehrt i,j==0,1, und vernachlässigen Sie die Lösung bei i,j==1,0. Verwenden Sie stattdessen für die Indizes aller Maxima i,j = where(a==a.max().
gg349
36

argmax()gibt nur das erste Vorkommen für jede Zeile zurück. http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

Wenn Sie dies jemals für ein geformtes Array tun müssen, funktioniert dies besser als 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())

Sie können auch Ihre Bedingungen ändern:

indices = np.where(a >= 1.5)

Das Obige gibt Ihnen Ergebnisse in der Form, die Sie angefordert haben. Alternativ können Sie in eine Liste von x, y-Koordinaten konvertieren, indem Sie:

x_y_coords =  zip(indices[0], indices[1])
SevakPrime
quelle
2
Das hat bei mir nicht funktioniert ... Meinst du indices = np.where(a==a.max())in Zeile 3?
Atomh33ls
Du hast recht, atomh33ls! Danke, dass du das entdeckt hast. Ich habe diese Aussage so korrigiert, dass sie das zweite Gleichheitszeichen für die richtige Bedingung enthält.
SevakPrime
@SevakPrime, es gab einen zweiten Fehler, auf den @ atomh33ls .max()anstelle von hingewiesen hat .argmax(). Bitte bearbeiten Sie die Antwort
gg349
@ gg349, es kommt darauf an, was du willst. argmax liefert es entlang einer Achse, die so zu sein scheint, wie das OP es wünscht, nachdem es diese Antwort von eumiro genehmigt hat.
SevakPrime
Ich sehe, dass die Korrektur @ atomh33ls und ich vorschlagen, zum Index der größten Elemente des Arrays zu führen, während das OP nach den größten Elementen entlang einer bestimmten Achse fragte. Beachten Sie jedoch, dass Ihre aktuelle Lösung dazu führt, x_y_coord = [(0, 2), (1, 1)]dass die Antwort von @eumiro NICHT übereinstimmt und falsch ist. Versuchen Sie beispielsweise mit, um sicherzustellen a = array([[7,8,9],[10,11,12]]), dass Ihr Code keinen Treffer für diese Eingabe hat. Sie erwähnen auch, dass dies besser funktioniert als unravel, aber die von @blas veröffentlichte Lösung beantwortet das Problem des absoluten Maximums, nicht nur entlang einer Achse.
gg349
3
v = alli.max()
index = alli.argmax()
x, y = index/8, index%8
ahmed
quelle