In Python können wir den Index eines Werts in einem Array mit .index () abrufen. Wie mache ich das mit einem NumPy-Array?
Wenn ich versuche zu tun
decoding.index(i)
es heißt, dass die NumPy-Bibliothek diese Funktion nicht unterstützt. Gibt es eine Möglichkeit, dies zu tun?
Verwenden Sie np.where
, um die Indizes abzurufen, für die eine Bedingung True
ist.
Beispiele:
Für einen 2D np.ndarray
namens a
:
i, j = np.where(a == value)
Für ein 1D-Array:
i, = np.where(a == value)
Was für Bedingungen wie >=
, <=
, !=
und so weiter funktioniert ...
Sie können auch eine Unterklasse von np.ndarray
mit einer index()
-Methode erstellen:
class myarray(np.ndarray):
def __new__(cls, *args, **kwargs):
return np.array(*args, **kwargs).view(myarray)
def index(self, value):
return np.where(self == value)
Testen:
a = myarray([1,2,3,4,4,4,5,6,4,4,4])
a.index(4)
#(array([ 3, 4, 5, 8, 9, 10]),)
Sie können ein numpy-Array in eine Liste konvertieren und dessen Index abrufen.
zum Beispiel
tmp = [1,2,3,4,5] #python list
a = numpy.array(tmp) #numpy array
i = list(a).index(2) # i will return index of 2, which is 1
ich bin genau das, was du willst.
Ich bin zwischen diesen beiden Arten der Implementierung eines Index eines NumPy-Arrays zerrissen:
idx = list(classes).index(var)
idx = np.where(classes == var)
Beide haben dieselbe Anzahl von Zeichen, aber die erste Methode gibt eine int
statt eines numpy.ndarray
zurück.
Sie können die Funktion numpy.nonzero()
oder die nonzero()
-Methode eines Arrays verwenden
import numpy as np
A = np.array([[2,4],
[6,2]])
index= np.nonzero(A>1)
OR
(A>1).nonzero()
Ausgabe :
(array([0, 1]), array([1, 0]))
Das erste Array in der Ausgabe zeigt den Zeilenindex und das zweite Array zeigt den entsprechenden Spaltenindex .
Dieses Problem kann mit der Bibliothek numpy_indexed effizient gelöst werden (Haftungsausschluss: Ich bin sein Autor); welches geschaffen wurde, um Probleme dieses Typs anzugehen. npi.indices kann als n-dimensionale Verallgemeinerung von list.index angesehen werden. Es wirkt auf nd-Arrays (entlang einer angegebenen Achse). und sucht auch mehrere Einträge in vektorisierter Weise im Gegensatz zu einem einzelnen Artikel auf einmal.
a = np.random.Rand(50, 60, 70)
i = np.random.randint(0, len(a), 40)
b = a[i]
import numpy_indexed as npi
assert all(i == npi.indices(a, b))
Diese Lösung hat eine bessere zeitliche Komplexität (im schlechtesten Fall n log n) als alle zuvor veröffentlichten Antworten und ist vollständig vektorisiert.
Wenn Sie sich für die Indizes interessieren, ist np.argsort (a) die beste Wahl.
a = np.random.randint(0, 100, 10)
sorted_idx = np.argsort(a)