Ich versuche, eine Matrix-Transponierungsfunktion in Python zu erstellen. Eine Matrix ist ein zweidimensionales Array, das als Liste von Listen mit ganzen Zahlen dargestellt wird. Das Folgende ist beispielsweise eine 2X3-Matrix (was bedeutet, dass die Höhe der Matrix 2 und die Breite 3 beträgt):
A=[[1, 2, 3],
[4, 5, 6]]
Um transponiert zu werden, sollte das j-te Element im i-ten Index das i-te Element im j-ten Index werden. So würde das obige Beispiel transponiert aussehen:
>>> transpose([[1, 2, 3],
[4, 5, 6]])
[[1, 4],
[2, 5],
[3, 6]]
>>> transpose([[1, 2],
[3, 4]])
[[1, 3],
[2, 4]]
Wie kann ich das machen?
Sie können Zip
mit *
um eine Matrix zu transponieren:
>>> A = [[ 1, 2, 3],[ 4, 5, 6]]
>>> Zip(*A)
[(1, 4), (2, 5), (3, 6)]
>>> lis = [[1,2,3],
... [4,5,6],
... [7,8,9]]
>>> Zip(*lis)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Wenn die zurückgegebene Liste eine Liste von Listen sein soll:
>>> [list(x) for x in Zip(*lis)]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
#or
>>> map(list, Zip(*lis))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Gibt es einen Preis dafür, faul zu sein und die Transponierungsfunktion von NumPy-Arrays zu nutzen? ;)
import numpy as np
a = np.array([(1,2,3), (4,5,6)])
b = a.transpose()
Wenn wir dieselbe Matrix zurückgeben wollten, würden wir schreiben:
return [[ m[row][col] for col in range(0,width) ] for row in range(0,height) ]
Dabei wird über eine Matrix m iteriert, indem jede Zeile durchlaufen und jedes Element in jeder Spalte zurückgegeben wird. Die Reihenfolge wäre also wie folgt:
[[1,2,3],
[4,5,6],
[7,8,9]]
Bei Frage 3 wollen wir stattdessen Spalte für Spalte vorgehen und jedes Element in jeder Zeile zurückgeben. Die Reihenfolge wäre also wie folgt:
[[1,4,7],
[2,5,8],
[3,6,9]]
Wechseln Sie daher einfach die Reihenfolge, in der wir iterieren:
return [[ m[row][col] for row in range(0,height) ] for col in range(0,width) ]