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
Barbara StreisandOriginal
2024-12-07 17:22:13716Durchsuche

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

Die gewünschte Ausgabe wäre:

[0, 3, 4]

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]

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]

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

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

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

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!

Stellungnahme:
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