transponiere / rotiere einen Block einer Matrix in Python

8

Ich habe eine 6x6 Matrix als eine Liste von Listen in Python. Die Matrix ist in 4 quadratische Blöcke der Größe 3x3 unterteilt. Ich möchte einen Weg, eine Transponierung von nur 1 Block zu machen. Ich kann es mit der traditionellen Methode machen, jedes Element durchzugehen und es in ein anderes Array und zurück zu kopieren, aber ich möchte sehen, ob es einen besseren Weg gibt (das Transponieren einer Matrix in Python kann in einer Zeile mit Hilfe von Zip-Methode)

für zB das ist die Darstellung der Matrix und ihrer Blöcke

%Vor%

und rotieren (3, rechts) sollte dazu führen

%Vor%

Ich möchte eine Methode finden, die eine Blocknummer aufnimmt und nur diesen Block nach links oder rechts dreht. Gibt es einen einfachen Weg, es zu tun?

    
randomThought 10.11.2011, 22:50
quelle

4 Antworten

5

Aufbauend auf Sven Marnachs Idee, np.rot90 zu verwenden, gibt es hier eine Version, die den Quadranten im Uhrzeigersinn dreht (wie gewünscht?). Im Schlüsselschritt

%Vor%

a copy() wird auf der rechten Seite (RHS) verwendet. Ohne die copy() , da die Werte block3 zugewiesen sind, werden auch die zugrunde liegenden Daten geändert, die auf der RHS verwendet werden. Dies verwirrt die Werte, die bei aufeinanderfolgenden Zuweisungen verwendet werden. Ohne copy() werden mehrere gleiche Werte über block3 verteilt.

Ich sehe keine Möglichkeit, diese Operation ohne eine Kopie auszuführen.

%Vor%     
unutbu 11.11.2011, 02:07
quelle
4

Für was es wert ist, hier ist, wie einfach dies in NumPy:

%Vor%     
Sven Marnach 10.11.2011 23:49
quelle
0

Wäre es eine Lösung, eine Matrix als ein Wörterbuch von Blöcken und einen Block als eine Liste von Listen zu definieren? In Ihrem Beispiel (ersetzen Sie transpose () durch die Funktion, mit der Sie es transponieren):

%Vor%     
Max Li 10.11.2011 23:10
quelle
0

Hier ist eine Methode, um einen "Block" aus der von Ihnen bereitgestellten Matrix zu drehen:

%Vor%

right ist ein Bool
Dies wird ein list of lists

zurückgeben

können Sie auch verwenden:

%Vor%

, aber das wird list of tuples

zurückgeben

BEARBEITEN:

Wenn wir über eine Matrix vom Typ sprechen:

%Vor%

Sie würden auf Block 3 zugreifen, indem Sie matrix[2]

verwenden

, so würde die Rotationsfunktion wie folgt verwendet werden:
rotate(matrix[2], True) #rotate block 3, right

    
Serdalis 10.11.2011 23:13
quelle

Tags und Links