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%Der Ansatz in tom10s Antwort kann auf beliebige Dimensionen erweitert werden:
%Vor%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.
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.
Tags und Links python optimization numpy premature-optimization