HOWTO · NumPy

Den ersten Index eines Elements in einem NumPy-Array finden

Dieses Tutorial zeigt, wie Sie den Index eines Elements in einem Array in Python finden

Auf dieser Seite

Um den ersten Index eines Werts in einem eindimensionalen NumPy-Array zu finden, verwenden Sie np.where(array == value)[0][0], wenn ein Treffer garantiert ist. Der Ausdruck liefert die Position des ersten Treffers. Kann der Wert fehlen, prüfen Sie vorher, ob ein Treffer vorhanden ist. NumPy-Indizes beginnen bei null.

Den ersten passenden Index mit np.where() finden

np.where(condition) gibt ein Tupel zurück, das für jede Dimension ein Array mit Indizes enthält. Bei einem eindimensionalen Array ist das erste Tupelelement die Liste der passenden Positionen. Wählen Sie dessen erstes Element aus, um den ersten Treffer zu erhalten.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import numpy as np

values = np.array([10, 20, 30, 40, 50, 20])
target = 20
matches = np.where(values == target)[0]
print(int(matches[0]))
1

Hier enthält matches beide Positionen, an denen 20 vorkommt, und matches[0] wählt die erste davon aus. Gibt es keinen Treffer, enthält matches keine Elemente, sodass der Zugriff per Index IndexError auslöst. Prüfen Sie matches.size, bevor Sie einen Index auswählen, wenn ein Treffer nicht garantiert ist. Die dreistellige Form np.where(condition, x, y) wählt stattdessen Werte aus x oder y aus; sie gibt keine Indizes zurück wie die hier gezeigte Form.

Mit np.nonzero() passende Indizes finden

Bei einer booleschen Bedingung gibt np.nonzero() die Indizes der Einträge zurück, die True sind. Wie die einargumentige Form von np.where() liefert die Funktion ein Tupel mit Index-Arrays, eines pro Array-Dimension. Bei einem eindimensionalen Array verwenden Sie das erste Array in diesem Tupel.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import numpy as np

values = np.array([4, 7, 4, 9])
positions = np.nonzero(values == 4)[0]
print(positions.tolist())

Das Ergebnis enthält alle passenden Positionen in der Reihenfolge des Arrays. Verwenden Sie positions[0] nur dann für den ersten Treffer, wenn Sie zuvor geprüft haben, dass das Array nicht leer ist. Bei einem mehrdimensionalen Array enthält jedes Tupelelement die Koordinaten entlang einer Dimension. Ordnen Sie die Einträge an denselben Positionen einander zu, um die Koordinaten jedes Treffers zu erhalten.

np.argmax() für einen booleschen Treffer verwenden

np.argmax() gibt die Position des größten Werts zurück. Auf eine boolesche Maske angewendet, liefert die Funktion die Position des ersten True, da True größer als False ist. Eine nichtleere Maske, deren Einträge alle False sind, ergibt ebenfalls 0. Prüfen Sie deshalb vor der Verwendung des Ergebnisses, ob ein Treffer vorhanden ist.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import numpy as np

values = np.array([5, 8, 3, 8])
mask = values == 8
first = int(np.argmax(mask)) if np.any(mask) else None
print(first)

Dieses Muster liefert None, wenn der Zielwert fehlt, andernfalls die Position des ersten Treffers. Für alle passenden Positionen verwenden Sie stattdessen np.where() oder np.nonzero().

list.index() nach dem Umwandeln des Arrays verwenden

Wenn Sie ein eindimensionales Array in eine Python-Liste umwandeln, können Sie die Listenmethode list.index() verwenden. Sie gibt das erste Vorkommen zurück. Durch die Umwandlung wird eine Python-Liste erstellt, was zusätzlichen Zeit- und Speicheraufwand verursacht. Diese Vorgehensweise ist meist für kleine Arrays oder für Code praktisch, der ohnehin mit Listen arbeitet.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import numpy as np

values = np.array([10, 20, 30, 20])
items = values.tolist()
target = 20
index = items.index(target) if target in items else None
print(index)

Mit der Mitgliedschaftsprüfung wird das Ergebnis für einen fehlenden Wert ausdrücklich als None angegeben. Wird der Wert nicht gefunden, löst ein direkter Aufruf von items.index(target) hingegen ValueError aus. Da sowohl die Prüfung als auch die Suche die Liste durchlaufen, können Sie bei einer einzelnen Suche stattdessen ValueError beim Aufruf von list.index() abfangen.

Für eigene Suchlogik eine Schleife verwenden

Eine Schleife ist nützlich, wenn jedes Element eine eigene Prüfung benötigt, die sich nur umständlich als vektorisierte NumPy-Bedingung ausdrücken lässt. Setzen Sie das Ergebnis zunächst auf einen Wert für „nicht gefunden“ und brechen Sie ab, sobald der erste Treffer auftritt.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import numpy as np

values = np.array([12, 15, 18, 21])
index = None

for position, value in enumerate(values):
    if value % 2 == 0 and value > 12:
        index = position
        break

print(index)

Die Schleife prüft die Elemente einzeln und endet beim ersten Wert, der beide Bedingungen erfüllt. Für einen einfachen Gleichheitsvergleich ist eine NumPy-Maske meist kürzer. Verwenden Sie die Schleife, wenn die Suchregel eigene Verzweigungen oder einen Zustand benötigt.

Fehlende Treffer, wiederholte Werte und Array-Dimensionen berücksichtigen

Wählen Sie die Ergebnisform passend zu Ihrer Aufgabe:

  • Für den ersten Treffer in einem eindimensionalen Array ermitteln Sie die Positionen mit np.where() oder np.nonzero(), prüfen Sie, ob mindestens eine vorhanden ist, und wählen Sie die erste aus.
  • Für alle Treffer behalten Sie das vollständige Index-Array. Bei wiederholten Werten gibt es mehrere Positionen. Wählen Sie nicht [0] aus, wenn Sie alle benötigen.
  • Bei einem zweidimensionalen Array gibt np.where(matrix == target) (row_indices, column_indices) zurück. Die Einträge an denselben Positionen bilden Koordinatenpaare. Zum Beispiel sind (rows[0], columns[0]) die Zeile und Spalte des ersten Treffers und kein einzelner flacher Index.
  • Wenn Sie ausdrücklich eine flache Position in einem mehrdimensionalen Array benötigen, glätten Sie das Array zuerst und suchen Sie in den geglätteten Werten. Mit np.unravel_index() können Sie diese flache Position bei Bedarf wieder in Koordinaten umwandeln.
  • Bei einer nichtleeren Maske, deren Einträge alle False sind, gibt np.argmax() null zurück; diese Position bedeutet jedoch nicht, dass ein Treffer vorliegt. Ist die Maske leer, löst np.argmax() stattdessen ValueError aus. Der oben gezeigte abgesicherte Ausdruck prüft zuerst np.any(mask) und gibt daher sowohl bei einer Maske ohne True-Einträge als auch bei einer leeren Maske None zurück.

Für die übliche Suche in numerischen Arrays ist np.where() eine direkte Wahl, wenn Sie den ersten oder alle Treffer benötigen. Verwenden Sie np.nonzero() für dieselben Positionen einer wahren Bedingung, np.argmax() für eine geprüfte boolesche Maske, list.index() wenn eine Python-Liste bereits sinnvoll ist, und eine Schleife für eigene Suchregeln.