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?


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)

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


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)

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)

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
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.