在没有模块的Python中转置矩阵?

时间:2017-01-27 20:07:09

标签: python

我试图在不使用numpy的情况下在Python 3.x中转换矩阵。出于某种原因,我在分配# XSLT VERSION Total execution time in seconds: 0.27568817138672 # DOM VERSION Total execution time in seconds: 0.37149095535278 方面遇到了问题。例如,如果我创建一个新的Matrix实例,例如test = new_matrix[col_num][row_num],则第一次通过内部for循环时,new_matrix将变为Matrix([[1,2,3,],[4,5,6],[7,8,9]])而不是[[1,None,None],[1,None,None],[1,None,None]]。我无法弄清楚为什么会发生这种情况以及为什么它会为列表的所有第一个元素赋值。

[[1,None,None],[None,None,None],[None,None,None]]

3 个答案:

答案 0 :(得分:2)

那是因为你使用:

构建newmatrix
new_matrix = [[None] * len(self.matrix[0])] * len(self.matrix)

如果你这样做:

<array-expr> * number

不复制该列表,复制参考。这意味着当你操纵newmatrix[0]时,你也操纵newmatrix[1]等等。

你应该用list-comprehension来解决它:

new_matrix = [[None] * len(self.matrix[0]) for _ in range(len(self.matrix))]

从那以后,你实际上为每一行构建一个新列表

所以算法应该看起来:

class Matrix:
    def __init__(self, matrix):
        self.matrix = matrix

    def transpose(self):
        new_matrix = [[None] * len(self.matrix[0]) for _ in range(len(self.matrix))]
        row_num = 0
        for row_num in range(len(self.matrix)):
            for col_num in range(len(self.matrix[0])):
                print(new_matrix[col_num][row_num])
                print(new_matrix)

                #assignment assigning more than one variable

                new_matrix[col_num][row_num] = self.matrix[row_num][col_num]

                print(new_matrix[col_num][row_num])
                print(new_matrix)

            col_num = 0
        return new_matrix

答案 1 :(得分:2)

used = []
if "test" in message:
    if "test" in used:
        time.sleep(5)
        del(used[:])
    else:
        sendMessage(s, "Testing command")
        used.append("test")

    break

必须替换为

new_matrix = [[None] * len(self.matrix[0])] * len(self.matrix)

这样,所有None都将是&#34;不同的&#34;。

但更短的方法是使用扩展名列表直接构建结果:

new_matrix = [[None for  j in self.matrix[0]] for i in self.matrix] 

答案 2 :(得分:1)

这是一个提示:

In [9]: arr = [[None] * 2] * 3

In [10]: arr
Out[10]: [[None, None], [None, None], [None, None]]

In [11]: arr[1][1] = 2

In [12]: arr
Out[12]: [[None, 2], [None, 2], [None, 2]]

你看到了问题吗?

列表复制(*运算符)在包含列表中重复相同的嵌套列表对象。相反,您应该每次都创建一个新列表。