it-swarm.com.de

Transponiere eine Matrix in Python

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?

27
Asher Garland

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]]
100

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()
23

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) ]
11
Asher Garland