Der beste Weg, den Inhalt jeder Spalte in numpy zu permutieren

8

Was ist der beste Weg, den Inhalt jeder Spalte in einem numplien Array effizient zu vertauschen?

Was ich habe, ist etwas wie:

%Vor%     
nopper 15.12.2014, 14:51
quelle

2 Antworten

6

Wenn Ihr Array mehrdimensional ist, np.random.permutation Permutationen entlang der ersten Achse (Spalten) standardmäßig:

%Vor%

Dies mischt jedoch die Zeilenindizes und so hat jede Spalte die gleiche (zufällige) Reihenfolge.

Die einfachste Möglichkeit, jede Spalte unabhängig zu mischen, könnte darin bestehen, die Spalten zu durchlaufen und np.random.shuffle um jeden einzelnen zu mischen:

%Vor%

Was gibt zum Beispiel:

%Vor%

Diese Methode kann nützlich sein, wenn Sie ein sehr großes Array haben, das Sie nicht kopieren möchten, weil die Permutation jeder Spalte an Ort und Stelle erfolgt. Auf der anderen Seite können selbst einfache Python-Schleifen sehr langsam sein und es gibt schnellere NumPy-Methoden wie die von @jme.

    
Alex Riley 15.12.2014, 14:54
quelle
5

Hier ist ein anderer Weg, dies zu tun:

%Vor%

Ein schneller Test:

%Vor%

Die Idee ist, eine Reihe von Zufallszahlen zu erzeugen, dann argsort sie innerhalb jeder Spalte unabhängig. Dies erzeugt eine zufällige Permutation der Indizes jeder Spalte.

Beachten Sie, dass dies eine suboptimale asymptotische Zeitkomplexität hat, da die Sortierung für ein Array der Größe O(n m log m) Zeit m x n benötigt. Aber da Pythons for -Schleifen ziemlich langsam sind, erhalten Sie tatsächlich eine bessere Leistung für alle außer sehr hohen Matrizen.

    
jme 15.12.2014 16:58
quelle

Tags und Links