Heim > Backend-Entwicklung > Python-Tutorial > Wie finde ich effizient Zeilenindizes bestimmter Werte in einem NumPy-Array?

Wie finde ich effizient Zeilenindizes bestimmter Werte in einem NumPy-Array?

Barbara Streisand
Freigeben: 2024-12-07 17:22:13
Original
723 Leute haben es durchsucht

How to Efficiently Find Row Indices of Specific Values in a NumPy Array?

Den Index spezifischer Werte in einem NumPy-Array finden

Problem:

Bestimmen Sie bei einem gegebenen Array X die Zeilenindizes der angegebenen Werte, die in searched_values ​​gespeichert sind. Im folgenden Beispiel suchen wir beispielsweise nach den Indizes für Werte [4, 2], [3, 3] und [5, 6] innerhalb des Arrays X.

X = np.array([[4,  2],
              [9,  3],
              [8,  5],
              [3,  3],
              [5,  6]])

searched_values = np.array([[4, 2],
                            [3, 3],
                            [5, 6]])
Nach dem Login kopieren

Die gewünschte Ausgabe wäre:

[0, 3, 4]
Nach dem Login kopieren

Lösungen:

Ansatz 1: NumPy Broadcasting

ist eine Möglichkeit, np.where zu nutzen und die Broadcasting-Funktionen sind wie folgt.

np.where((X == searched_values[:, None]).all(-1))[1]
Nach dem Login kopieren

Ansatz 2: Speichereffiziente lineare Indexkonvertierung

So konvertieren Sie jede Zeile mit NumPys np.ravel_multi_index in einen eindeutigen linearen Index. Es gibt.

dims = X.max(0) + 1
out = np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0]
Nach dem Login kopieren

Ansatz 3: Speichereffiziente und optimierte lineare Indexkonvertierung

NumPys np.searchsorted kann auch verwendet werden, um lineare Indizes schnell zu finden.

dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
out = sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)]
Nach dem Login kopieren

So funktioniert np.ravel_multi_index:

np.ravel_multi_index erstellt eine lineare Indexdarstellung eines mehrdimensionalen Index. Interpretieren Sie jede Zeile als Index in einem n-dimensionalen mehrdimensionalen Array und generieren Sie den entsprechenden linearen Index.

Beispiel: Anwenden von np.ravel_multi_index(X.T, dims) auf ein Beispielarray X:

np.ravel_multi_index(X.T, dims)
# Output: array([30, 66, 61, 24, 41])
Nach dem Login kopieren

Dies stellt den linearen Index dar, den jede Zeile des Arrays X hat. Dieser lineare Index kann verwendet werden, um jede Zeile im Array eindeutig zu identifizieren.

Der Beispielcode für jede Methode ist unten aufgeführt.

# Approach 1
print(np.where((X == searched_values[:, None]).all(-1))[1])

# Approach 2
dims = X.max(0) + 1
print(np.where(np.in1d(np.ravel_multi_index(X.T, dims),
                       np.ravel_multi_index(searched_values.T, dims)))[0])

# Approach 3
dims = X.max(0) + 1
X1D = np.ravel_multi_index(X.T, dims)
searched_valuesID = np.ravel_multi_index(searched_values.T, dims)
sidx = X1D.argsort()
print(sidx[np.searchsorted(X1D, searched_valuesID, sorter=sidx)])
Nach dem Login kopieren

Mit beiden Ansätzen können Sie den Zeilenindex eines bestimmten Werts in Array X leicht ermitteln.

Das obige ist der detaillierte Inhalt vonWie finde ich effizient Zeilenindizes bestimmter Werte in einem NumPy-Array?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage