it-swarm.com.de

Index des Elements im NumPy-Array

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? 

32
Marc Ortiz

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

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.

13
Statham

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.

6
jlansey

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 .

1
N.Moudgil

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.

0

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)
0
Victor Zuanazzi