2013-11-01 3 views
8

Angesichts einer großen 2d numpy Array möchte ich eine Reihe von Zeilen, sagen Zeilen 10000:10010 effizient entfernen. Ich muss das mehrfach mit verschiedenen Bereichen machen, also möchte ich es auch parallelisierbar machen.Wie kann man eine Reihe von Zeilen effizient aus einem großen numpy Array entfernen?

Verwenden Sie etwas wie numpy.delete() ist nicht effizient, da es das Array kopieren muss, zu viel Zeit und Speicher. Im Idealfall möchte ich etwas wie eine Ansicht erstellen, aber ich bin mir nicht sicher, wie ich das in diesem Fall tun könnte. Ein maskiertes Array ist ebenfalls keine Option, da die Downstream-Operationen auf maskierten Arrays nicht unterstützt werden.

Irgendwelche Ideen?

+1

Was sind die nachgelagerten Vorgänge? Sie könnten versuchen, die Löschung zu fälschen, indem Sie die zu löschenden Zeilen verfolgen ... – Jaime

Antwort

3

Aufgrund der schrittweisen Datenstruktur, die ein numpy Array definiert, ist das, was Sie wollen, ohne Verwendung eines maskierten Arrays nicht möglich. Ihre beste Option könnte sein, ein maskiertes Array (oder vielleicht ein eigenes boolesches Array) zu verwenden, um die gelöschten Zeilen zu maskieren und dann eine einzelne echte delete Operation aller zu löschenden Zeilen auszuführen, bevor Sie sie stromabwärts übergeben.

+0

Danke, ich vermutete, dass es keinen Weg gibt (aber sehen wir mal, ob jemand eine kreative Lösung vorschlägt). Ich verstehe nicht, warum Sie vorgeschlagen haben zu maskieren und dann zu löschen - wie ist das besser als nur zu löschen? – Bitwise

+1

Das ist teilweise eine Schätzung darüber, wie Ihr Code, der herausfinden, was zu löschen ist, funktionieren muss. Wie Sie bereits erwähnt haben, ist das wiederholte Löschen von Reihen ineffizient (sowohl hinsichtlich des Arbeitsspeichers als auch der Zeit). Außerdem interpretierte ich "Ich muss das mehrfach mit verschiedenen Bereichen tun" als den Teil, der parallelisiert werden könnte. Um dies parallel zu tun, sollten Sie das zugrunde liegende Array unverändert lassen und einfach die entsprechenden "gelöschten" Bits umdrehen. Wenn Sie dann alle Zeilen ermittelt haben, die gelöscht werden sollen, können Sie die eigentliche Operation "Löschen" im letzten nicht parallelen Schritt ausführen. –

2

Es gibt nicht wirklich eine gute Möglichkeit, den Löschvorgang zu beschleunigen, wie Sie bereits angedeutet haben, diese Art des Löschens erfordert, dass die Daten in den Speicher kopiert werden. Das einzige, was Sie tun können, wie von @WarrenWeckesser vorgeschlagen, ist das Kombinieren mehrerer Löschoperationen und deren gleichzeitige Anwendung. Hier ein Beispiel:

ranges = [(10, 20), (25, 30), (50, 100)] 
mask = np.ones(len(array), dtype=bool) 

# Update the mask with all the rows you want to delete 
for start, end in ranges: 
    mask[start:stop] = False 

# Apply all the changes at once 
new_array = array[mask] 

Es ist nicht wirklich Sinn, dies zu parallelisieren, weil Sie nur Sachen im Speicher zu kopieren, so wird dieser Speicher sowieso gebunden wird, wird mehr Cpus Zugabe nicht helfen.

0

Ich weiß nicht, wie schnell das ist, relativ zu den oben genannten, aber sagen Sie, Sie haben eine Liste L der Zeilenindizes der Zeilen, die Sie von Array A behalten wollen (mit "Zeilen" meine ich den ersten Index, für höherdimensionale Arrays). Alle anderen Zeilen werden gelöscht. Wir lassen A das Ergebnis halten.

A = A[np.ix_(L)] 
Verwandte Themen