Argmax des Numpy-Arrays, das nicht flache Indizes zurückgibt

95

Ich versuche, die Indizes des maximalen Elements in einem Numpy-Array abzurufen. Dies kann mit erfolgen numpy.argmax. Mein Problem ist, dass ich das größte Element im gesamten Array finden und die Indizes dafür erhalten möchte.

numpy.argmax kann entweder entlang einer Achse angewendet werden, was nicht das ist, was ich will, oder auf das abgeflachte Array, was genau das ist, was ich will.

Mein Problem ist, dass die Verwendung numpy.argmaxmit axis=Noneden flachen Index zurückgibt, wenn ich den mehrdimensionalen Index möchte.

Ich könnte verwenden divmod, um einen nicht flachen Index zu erhalten, aber das fühlt sich hässlich an. Gibt es einen besseren Weg, dies zu tun?

Andreas Müller
quelle

Antworten:

160

Sie könnten numpy.unravel_index()für das Ergebnis verwenden von 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
quelle
21
np.where(a==a.max())

Gibt die Koordinaten der maximalen Elemente zurück, muss das Array jedoch zweimal analysieren.

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

Dies gibt im Vergleich zu argmaxKoordinaten aller Elemente zurück, die dem Maximum entsprechen. argmaxgibt nur einen von ihnen zurück (gibt np.ones(5).argmax()zurück 0).

Eumiro
quelle
10
Dadurch wird das Array dreimal und nicht nur zweimal wiederholt. Einmal, um das Maximum zu finden, ein zweites Mal, um das Ergebnis zu erstellen ==, und ein drittes Mal, um die TrueWerte aus diesem Ergebnis zu extrahieren . Beachten Sie, dass möglicherweise mehr als ein Element dem Maximum entspricht.
Sven Marnach
1

Um den nicht flachen Index aller Vorkommen des Maximalwerts zu erhalten, können Sie die Antwort von eumiro geringfügig ändern, indem Sie argwhereanstelle von 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
quelle
Es ist nicht effektiv, da Sie drei Durchgänge und eine Matrixerstellung erhalten. Stellen Sie sich vor, wir haben ein 9000x7000-Bild (A3 bei 600 dpi) - würden Sie trotzdem auf Ihrer Lösung bestehen?
Maksym Ganenko