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
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
@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. –
Nein, nicht maskiertes Array; Maske wie im booleschen Index. – hpaulj