Vektorisieren iterative Addition in NumPy-Arrays

8

Für jedes Element in einem randomisierten Array von 2D-Indizes (mit möglichen Duplikaten) möchte ich "+ = 1" zum entsprechenden Gitter in einem 2D-Null-Array. Ich weiß jedoch nicht, wie ich die Berechnung optimieren soll. Verwenden Sie den Standard für die Schleife, wie hier gezeigt,

%Vor%

Die Laufzeit kann sehr bedeutsam sein:

%Vor%

Gibt es eine Möglichkeit, diesen iterativen Prozess zu vektorisieren?

    
neither-nor 27.06.2015, 22:05
quelle

3 Antworten

8

Sie könnten es etwas beschleunigen, indem Sie np.add.at , die den Fall von doppelten Indizes korrekt behandelt:

%Vor%

was

ergibt %Vor%

Und YXDs Vorschlag:

%Vor%     
DSM 27.06.2015, 23:07
quelle
6

Divakars Antwort hat mich dazu gebracht, folgendes zu versuchen, was die bisher schnellste Methode zu sein scheint:

%Vor%

Zeiten:

%Vor%     
user2379410 28.06.2015 14:47
quelle
5

Sie können R,C -Indizes von idx in lineare Indizes umwandeln, dann die eindeutigen count mit ihren counts herausfinden und sie schließlich in der Ausgabe grids als endgültige Ausgabe speichern. Hier ist die Implementierung, um das gleiche zu erreichen -

%Vor%

Laufzeittests -

Hier sind die Laufzeittests, die alle Ansätze abdecken (einschließlich @ DSMs Ansätze ) und die gleichen Definitionen verwenden wie in diese Lösung -

%Vor%

Die Laufzeiten deuten darauf hin, dass der vorgeschlagene np.unique basierte Ansatz mehr als 50% schneller ist als der zweitschnellste Ansatz.

    
Divakar 28.06.2015 05:57
quelle