Wie kann man eine Reihe von Zeilen effizient aus einem großen numpy Array entfernen?

8

Bei einem großen 2d-Array mit numpy würde ich gerne eine Reihe von Zeilen entfernen, sagen wir Zeilen 10000:10010 effizient. Ich muss das mehrfach mit verschiedenen Bereichen machen, also möchte ich es auch parallelisierbar machen.

Die Verwendung von etwas wie numpy.delete() ist nicht effizient, da es das Array kopieren muss, was zu viel Zeit und Speicher kostet. 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 auch keine Option, da die Downstream-Operationen auf maskierten Arrays nicht unterstützt werden.

Irgendwelche Ideen?

    
Bitwise 01.11.2013, 02:07
quelle

3 Antworten

3

Aufgrund der schrittweisen Datenstruktur, die ein numpy Array definiert, ist das, was Sie wollen, nicht möglich, ohne ein maskiertes Array zu verwenden. Ihre beste Option könnte darin bestehen, 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 stromabwärts übergeben wird.

    
Warren Weckesser 01.11.2013, 02:35
quelle
2

Es gibt nicht wirklich eine gute Möglichkeit, den Löschvorgang zu beschleunigen. Wie Sie bereits erwähnt haben, erfordert diese Art des Löschens, 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 ist ein Beispiel:

%Vor%

Es ist nicht wirklich sinnvoll, dies zu parallelisieren, weil du nur Sachen im Speicher kopierst, so dass diese sowieso speichergebunden sind. Das Hinzufügen von mehr CPUs wird nicht helfen.

    
Bi Rico 01.11.2013 02:51
quelle
0

Ich weiß nicht, wie schnell das ist, relativ zu den obigen, 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.

%Vor%     
Rafael_Espericueta 17.07.2016 23:36
quelle

Tags und Links