Schere ein numpy Array

8

Ich möchte ein numpliges Array "scheren". Ich bin mir nicht sicher, ob ich den Begriff "Scherung" richtig verwende. Mit Scherung meine ich etwas wie:

Verschiebe die erste Spalte um 0 Stellen
Verschiebe die zweite Spalte um 1 Stelle Verschiebe die dritte Spalte um 2 Stellen usw. ...

Also dieses Array:

%Vor%

würde sich entweder in dieses Array verwandeln:

%Vor%

oder etwas wie dieses Array:

%Vor%

abhängig davon, wie wir mit den Kanten umgehen. Ich bin nicht besonders über Kantenverhalten.

Hier ist mein Versuch einer Funktion, die dies tut:

%Vor%

Es scheint zu funktionieren. Bitte sag mir, wenn es nicht ist!

Es scheint auch klobig und unelegant. Überblicke ich eine eingebaute numpy / scipy Funktion, die das tut? Gibt es einen saubereren / besseren / effizienteren Weg, dies in einer numply zu tun? Erfinde ich das Rad neu?

BEARBEITEN:
Bonuspunkte, wenn dies auf einem N-dimensionalen Array statt nur auf dem 2D-Fall funktioniert.

Diese Funktion wird im Mittelpunkt einer Schleife stehen, die ich in unserer Datenverarbeitung viele Male wiederholen werde, daher vermute ich, dass es sich lohnt, sie zu optimieren.

ZWEITE BEARBEITUNG: Ich habe endlich ein Benchmarking durchgeführt. Es sieht aus wie numpy.roll ist der Weg zu gehen, trotz der Schleife. Danke, tom10 und Sven Marnach!

Benchmarking-Code: (läuft unter Windows, benutze keine time.clock unter Linux, glaube ich)

%Vor%     
Andrew 14.02.2011, 23:36
quelle

5 Antworten

5

Der Ansatz in tom10s Antwort kann auf beliebige Dimensionen erweitert werden:

%Vor%     
Sven Marnach 15.02.2011, 16:44
quelle
7

numpy roll tut dies. Wenn das ursprüngliche Array beispielsweise x ist,

%Vor%

erzeugt

%Vor%     
tom10 15.02.2011 00:02
quelle
7

Dies kann mit einem Trick geschehen, der in beschrieben wird diese Antwort von Joe Kigton :

%Vor%

Um "clip" anstelle von "roll" zu erhalten, verwenden Sie

%Vor%

Dies ist wahrscheinlich die effizienteste Methode, da es überhaupt keine Python-Schleife verwendet.

    
Sven Marnach 14.02.2011 23:54
quelle
2

Hier ist eine aufgeräumte Version Ihres eigenen Ansatzes:

%Vor%

Der Hauptunterschied besteht darin, dass numpy.indices() verwendet wird, anstatt Ihre eigene Version zu rollen.

    
Sven Marnach 15.02.2011 16:25
quelle
0
%Vor%

denke ich. Sie sollten diesen Pseudocode mehr als nur Python betrachten. Im Grunde transponieren Sie das Array, ordnen Sie ihm eine allgemeine Rotationsfunktion zu, um die Rotation durchzuführen, und transponieren Sie es dann zurück.

    
Anon. 14.02.2011 23:48
quelle