Python中矩阵转置

31

我正在尝试在Python中创建一个矩阵转置函数。矩阵是一个二维数组,用整数列表的列表表示。例如,以下是一个2X3矩阵(意味着矩阵的高度为2,宽度为3):

A=[[1, 2, 3],
   [4, 5, 6]]

为了将第 i 个索引中的第 j 个项目转置,第 j 个索引中的第 i 个项目应该变成第 i 个索引中的第 i 个项目。以下是转置后上面示例的样子:

>>> transpose([[1, 2, 3],
               [4, 5, 6]])
[[1, 4],
[2, 5],
[3, 6]]
>>> transpose([[1, 2],
               [3, 4]])
[[1, 3],
[2, 4]]

我该如何做到这一点?


1
你可以在这里找到答案:https://dev59.com/42w15IYBdhLWcg3wqNcA#38815389 - 1man
3个回答

110
你可以使用 zip* 来获取矩阵的转置:
>>> 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)]

如果你希望返回的列表是一个嵌套列表:

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

3
在 Python 3 中,map 函数返回的是一个迭代器,因此要从上一个解决方案中获取列表,你需要使用 list(map(list, zip(*lis))) 或者 [*map(list, zip(*lis))] - PM 2Ring
1
你能否详细解释一下 zip(*lis) 中的 * 是如何工作的? - kaushalpranav

28

使用NumPy数组的转置函数懒惰的行为是否有奖励? ;)

import numpy as np

a = np.array([(1,2,3), (4,5,6)])

b = a.transpose()

1
你的答案不正确,因为给出的骨架函数。这个答案必须使用列表推导完成。下面的答案是正确的。不过提供了很好的信息。 - Asher Garland
2
你不仅导入了一个庞大的库来完成可以用一行纯Python代码实现的任务,而且你的答案在技术上也是错误的,因为输出不是像问题中显示的列表嵌套列表,而是一个NumPy数组。因此,这个答案更长、更慢,因为你需要将其转换为NumPy数组,进行转置,然后再转换回来。 - Ehsan Kia

13

如果我们想要返回同样的矩阵,我们会写:

return [[ m[row][col] for col in range(0,width) ] for row in range(0,height) ]

这个操作遍历矩阵m,通过遍历每一行并返回每列中的每个元素。 因此顺序类似于:

[[1,2,3],
[4,5,6],
[7,8,9]]

现在针对第3个问题,我们想要逐列进行操作,返回每行中的每个元素。因此顺序应该如下:

[[1,4,7],
[2,5,8],
[3,6,9]]

因此,我们只需要交换迭代的顺序:

return [[ m[row][col] for row in range(0,height) ] for col in range(0,width) ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接