2014-01-09 12 views
6

Angenommen, wir haben eine numpy.darray Daten, sagen wir mit der Form (100,200), und Sie haben auch eine Liste von Indizes, die Sie aus den Daten ausschließen möchten. Wie würdest du das machen? Etwas wie dieses:Wie Zeilen/Spalten von numpy.narray Daten auszuschließen

a = numpy.random.rand(100,200) 
indices = numpy.random.randint(100,size=20) 
b = a[-indices,:] # imaginary code, what to replace here? 

Danke.

Antwort

7

Sie b = numpy.delete(a, indices, axis=0)

Quelle verwenden können: NumPy docs.

+3

Für eine numerische Liste von Indizes verwendet 'np.delete' die' maske' Lösung, die Sie zuvor abgelehnt haben, weil sie zu viel Speicher belegt. – hpaulj

+0

@hpaulj die Dokumentation für 'löschen' sagt: " out: ndarray Eine Kopie von 'arr' mit den durch' obj' angegebenen Elementen entfernt. " Meinst du, dass es ein 'numpy.ma' maskiertes Array verwendet? Es hört sich für mich nicht so an. –

+0

Nein, nicht maskiertes Array; Maske wie im booleschen Index. – hpaulj

2

Es ist hässlich, aber funktioniert:

b = np.array([a[i] for i in range(m.shape[0]) if i not in indices]) 
0

Sie so etwas wie dies versuchen könnte:

a = numpy.random.rand(100,200) 
indices = numpy.random.randint(100,size=20) 
mask = numpy.ones(a.shape, dtype=bool) 
mask[indices,:] = False 
b = a[mask] 
+0

Diese Lösung eine Reihe von genau der gleichen braucht Größe wie meine ursprünglichen Daten, die in meinem Fall riesig ist. Die zeitliche und räumliche Komplexität dieser Lösung ist O (n^2), was für meine Daten nicht wirklich praktisch ist. – adrin

+1

Dies ist im Wesentlichen Methode die 'np.delete' verwendet. Schau, wo es 'keep = one (N, dtype = bool) konstruiert; behalte [obj,] = Falsch'. – hpaulj

1

Sie könnten versuchen:

a = numpy.random.rand(100,200) 
indices = numpy.random.randint(100,size=20) 
b = a[np.setdiff1d(np.arange(100),indices),:] 

Dies vermeidet in https://stackoverflow.com/a/21022753/865169 die mask Array von derselben Größe wie Ihre Daten zu schaffen. Beachten Sie, dass dieses Beispiel in der letzten Antwort ein 2D-Array b anstelle des abgeflachten Arrays erstellt.

Eine grobe Untersuchung von Laufzeit vs Speicherkosten dieses Ansatzes vs https://stackoverflow.com/a/30273446/865169 scheint darauf hinzudeuten, dass delete schneller ist, während sie mit setdiff1d Indizierung viel einfacher, auf den Speicherverbrauch ist:

In [75]: %timeit b = np.delete(a, indices, axis=0) 
The slowest run took 7.47 times longer than the fastest. This could mean that an intermediate result is being cached. 
10000 loops, best of 3: 24.7 µs per loop 

In [76]: %timeit c = a[np.setdiff1d(np.arange(100),indices),:] 
10000 loops, best of 3: 48.4 µs per loop 

In [77]: %memit b = np.delete(a, indices, axis=0) 
peak memory: 52.27 MiB, increment: 0.85 MiB 

In [78]: %memit c = a[np.setdiff1d(np.arange(100),indices),:] 
peak memory: 52.39 MiB, increment: 0.12 MiB 
Verwandte Themen