2016-05-21 11 views
1

Gibt es eine einzige Numpy Funktion, dieListe der Indizes von jedem Wert

[array == value for value in np.unique(array)] 

oder

[np.where(array == value) for value in np.unique(array)] 

Oder wenn nicht, wird ein effizienter Weg, dies zu tun, entspricht? Diese durchlaufen das Array len(np.unique(array)) Mal, wenn Sie es in einem einzigen Durchlauf tun können:

indices = defaultdict(list) 
for index, value in enumerate(array): 
    indices[value].append(index) 

Ich würde eine Lösung wie die keine expliziten erfordert für Schleife.

+0

Es gibt verschiedene Möglichkeiten, dieses Problem zu lösen. welches davon am besten geeignet ist, hängt ein wenig vom Kontext ab; wie Sie diese Ergebnisse verwenden möchten. –

Antwort

2

Wenn Sie was Sie wollen, ist eine Maske, mit mehreren eindeutigen Nummer Bedingungen, können Sie es return_inverse von np.unique tun mit:

eine Probe-Array mit

>>> a = np.random.randint(5, 10, size=100) # 100 [5-10) random numbers 

Und seine einzigartige Zahlen und inverse Abbildung

Wir können einen Container mit zusätzlichen Abmessungen (a.shape + 1 Dimension Feind jedes einzigartig erstellen Nummer)

>>> indexes = np.zeros((a.shape[0], unique.size), dtype=np.bool) 

und schließlich das Array mit der inversen Mapping-füllen:

>>> indexes[np.arange(a.size), inverse] = True 

Die indexes Karte True in der letzten Dimension enthält, um den Index der eindeutigen Nummer entspricht, die es übereinstimmt (die Reihenfolge im unique Array).

>>> indexes[:3, :] 
array([[False, False, False, False, True], 
     [ True, False, False, False, False], 
     [False, False, False, True, False]], dtype=bool) 

Jede Zeile entspricht dem Index des ursprünglichen Arrays a und jede Spalte entspricht einer eindeutigen Nummer .

+0

Das ist so hervorragend! Vielen Dank! –

+0

@ 1 "Kein Problem! Es ist schwieriger, wenn Sie' N 'Bedingungen (anders als * Eindeutigkeit *) überprüfen möchten .. aber für einzigartige Zahlen sollte dies den Job machen :) –

1

Ihre Frage ist ein wenig mehrdeutig; aber sehen Sie sich numpy_indexed an; Es scheint, als ob entweder npi.indices, npi.contains oder npi.in_ zur Lösung Ihres Problems verwendet werden können.

+0

Danke! Alles in Numpy selbst, das ist gleichbedeutend damit? –

+0

numpy.in1d ​​könnte für Ihre Zwecke funktionieren –

Verwandte Themen