Python中的矩阵转置

161 投票
19 回答
178031 浏览
提问于 2025-04-16 11:28

我正在尝试为Python创建一个矩阵转置的函数,但我似乎无法让它正常工作。

假设我有

theArray = [['a','b','c'],['d','e','f'],['g','h','i']]

我希望我的函数能得到

newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]

换句话说,如果我把这个二维数组打印出来,想把行变成列,把列变成行。

到目前为止,我做了这个,但它不工作

def matrixTranspose(anArray):
    transposed = [None]*len(anArray[0])
    for t in range(len(anArray)):
        for tt in range(len(anArray[t])):
            transposed[t] = [None]*len(anArray)
            transposed[t][tt] = anArray[tt][t]
    print transposed

19 个回答

42

如果你的行数不相等,你也可以使用 map

>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
>>> map(None,*uneven)
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]

补充说明:在Python 3中,map的功能发生了变化,可以使用 itertools.zip_longest 来代替:
来源:Python 3.0的新特性

>>> import itertools
>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
>>> list(itertools.zip_longest(*uneven))
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]
68
>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
>>> [list(i) for i in zip(*theArray)]
[['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f', 'i']]

这个列表生成器会创建一个新的二维数组,里面的元素是列表,而不是元组。

347

Python 2:

>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
>>> zip(*theArray)
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]

Python 3:

>>> [*zip(*theArray)]
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]

撰写回答