代码之家  ›  专栏  ›  技术社区  ›  Suyash Nachankar

为什么矩阵的所有行都与最后一行相同?

  •  0
  • Suyash Nachankar  · 技术社区  · 11 月前

    有人能帮我找出代码中的错误吗?如果我创建一个具有静态初始值的空白二维矩阵,它将返回正确的转置矩阵。而如果我使用for循环创建一个空白矩阵,它会返回答案中所有行的最后一行。

    # Original Matrix :
    [[1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9]]
    
    # Expected Transpose :
    [[1, 4, 7],
    [2, 5, 8],
    [3, 6, 9]]
    
    # Actual Transpose :
    [[3, 6, 9],
    [3, 6, 9],
    [3, 6, 9]]
    
    
    # Transpose Matrix
    
    def transpose_mtx(original):
        t_cols = len(original)
        t_rows = len(original[0])
    
        # creating a blank matrix with 0s of transpose shape
        row = [0 for _ in range(t_cols)]
        t_mtx = [row for _ in range(t_rows)]
    
        # t_mtx = [[0,0,0],[0,0,0], [0,0,0]]
        # if I keep this line instead, it returns correct answer
     
        # rows of original
        for i in range(len(original)):
            # columns of original
            for j in range(len(original[0])):
                # interchange items
                t_mtx[j][i] = original[i][j]
        
        return t_mtx
    
    
    my_mtx = [[1,2, 3],
              [4, 5, 6],
              [7, 8, 9]]
    
    print(transpose_mtx(my_mtx))
    
    3 回复  |  直到 11 月前
        1
  •  1
  •   Sharim09    11 月前

    问题是,您将列表用作列表的一个元素(正如它在矩阵中应该的那样),但这里的问题是您将所有行用作同一个列表(即 row ),如果你知道列表是可变的,这意味着它们可以从任何地方更新,并且所有引用的列表都会发生变化。

    现在,在这种情况下,t_mtx将所有行用作相同的引用列表( 一行 ),这意味着每次更新任何行时,它都会更新所有行,这就是为什么所有行都与最后一行相同。

    因此,在这里,您可以每次创建新行,也可以使用.copy()方法创建行列表的新副本。

    t_mtx = [row.copy() for _ in range(t_rows)]
    
    

    输出

    enter image description here

    希望你能理解,抱歉我英语不好。

        2
  •  1
  •   JayPeerachai    11 月前

    您需要通过为转置矩阵中的每一行创建单独的列表来初始化一个空白矩阵。

    # Creating a blank matrix with 0s of transpose shape
    t_mtx = [[0 for _ in range(t_cols)] for _ in range(t_rows)]
    
        3
  •  0
  •   Suramuthu R    11 月前
    mtrx = [[1, 2, 3], 
            [4, 5, 6], 
            [7, 8, 9]]
    
    transposed = []
    
    for j in range(len(mtrx[0])):
        sub = []
        for x in mtrx:
            sub.append(x[j])
        transposed.append(sub)
    
    print(transposed) # Output : [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    

    一个等效衬垫:

    transposed = [[x[j] for x in mtrx] for j in range(len(mtrx[0]))]