有人可以向我解释为什么使用以下函数转置矩阵是错误的:
def transpose(m):
for row in range(len(m)):
for col in range(len(m[0])):
m[row][col] = m[col][row]
return m
# example matrix:
m = [[1,2,3], [4,5,6],[7,8,9]]
答案 0 :(得分:3)
Python为此提供了一个方便的函数zip。它默认返回元组,因此您需要对结果集执行列表理解以获取列表列表。
def transpose(m):
return [list(x) for x in zip(*m)]
答案 1 :(得分:1)
您的方法存在的问题是您需要交换元素。假设您要交换项(1, 2)
和(2, 1)
。但是,您只需将(2, 1)
的值分配给(1, 2)
(您将失去(1, 2)
处的值),然后使用 new 值(1, 2)
替换(2, 1)
。这就是为什么你的方法不会给你正确的结果。但是你可以交换元素:
def transpose(m):
for row in range(len(m)):
for col in range(row, len(m[0])):
m[row][col], m[col][row] = m[col][row], m[row][col] # swap
return m
请注意,col
现在以row
- 索引开头,这样就不会交换两次(从而无法实现转置的目的)。
>>> transpose(m)
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
注意:但是如果您打算使用非方形矩阵,它将失败。一般来说,zip
或np.transpose
应该受到青睐。例如:
>>> list(map(list, zip(*m)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
>>> import numpy as np
>>> np.transpose(m)
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])