Ermitteln Sie die Position des größten Werts in einem mehrdimensionalen NumPy-Array

81

Wie kann ich die Position (Indizes) des größten Werts in einem mehrdimensionalen NumPy-Array ermitteln?

kame
quelle
Wenn es mehrere Positionen mit gleich großen Werten gibt, benötigen Sie alle oder nur die erste (oder die letzte oder nur eine)?
Trilarion

Antworten:

176

Die argmax()Methode sollte helfen.

Aktualisieren

(Nach dem Lesen des Kommentars) Ich glaube, die argmax()Methode würde auch für mehrdimensionale Arrays funktionieren. Die verknüpfte Dokumentation gibt ein Beispiel dafür:

>>> a = array([[10,50,30],[60,20,40]])
>>> maxindex = a.argmax()
>>> maxindex
3

Update 2

(Dank KennyTMs Kommentar) Sie können unravel_index(a.argmax(), a.shape)den Index als Tupel abrufen :

>>> from numpy import unravel_index
>>> unravel_index(a.argmax(), a.shape)
(1, 0)
Manoj Govindan
quelle
1
Aber ich habe ein mehrdimensionales Array.
Kam
85
Verwenden Sie unravel_index(a.argmax(), a.shape)diese Option , um den Index als Tupel abzurufen.
Kennytm
Was bedeutet Nummer 3? In Ordnung, ich verstehe. Ich habe gesucht (1,0).
Kam
2
Es sollte wirklich eine eingebaute Funktion geben, um den Wert als Tupel zu erhalten
Endolith
unravel_index docs: docs.scipy.org/doc/numpy-1.10.1/reference/generated/…
Bogdan Varlamov
6

(bearbeiten) Ich bezog mich auf eine alte Antwort, die gelöscht worden war . Und die akzeptierte Antwort kam nach meiner. Ich stimme zu, das argmaxist besser als meine Antwort.

Wäre es nicht lesbarer / intuitiver, dies zu tun?

numpy.nonzero(a.max() == a)
(array([1]), array([0]))

Oder,

numpy.argwhere(a.max() == a)
otterb
quelle
4
Unnötig langsam, weil Sie das Maximum berechnen und es dann mit allen vergleichen. unravel_index (a.argmax (), a.shape).
Peter
Ich habe dafür gestimmt, weil es nichts über die Anzahl der Vorkommen von a.max () in a voraussetzt. Während a.argmax () das "erste" Vorkommen zurückgibt (was im Fall eines mehrdimensionalen Arrays schlecht definiert ist, da es von der Wahl des Durchquerungspfads abhängt). docs.scipy.org/doc/numpy/reference/generated/… Ich denke auch, dass np.where () eine natürlichere / lesbarere Wahl ist als np.nonzero ().
FizxMike
2

Sie können einfach eine Funktion schreiben (die nur in 2d funktioniert):

def argmax_2d(matrix):
    maxN = np.argmax(matrix)
    (xD,yD) = matrix.shape
    if maxN >= xD:
        x = maxN//xD
        y = maxN % xD
    else:
        y = maxN
        x = 0
    return (x,y)
iFederx
quelle
0

Eine alternative Möglichkeit ist die Veränderung numpyArray listund die Verwendung maxund indexMethoden:

List = np.array([34, 7, 33, 10, 89, 22, -5])
_max = List.tolist().index(max(List))
_max
>>> 4

quelle