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])

Antworten:


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

array([1, 1, 0])

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

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])

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.