这种转置矩阵的方法有什么问题

时间:2017-03-24 00:30:27

标签: python list sequences

有人可以向我解释为什么使用以下函数转置矩阵是错误的:

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

2 个答案:

答案 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]]

注意:但是如果您打算使用非方形矩阵,它将失败。一般来说,zipnp.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]])