【问题标题】:How to change a specific element in a matrix to match another matrix?如何更改矩阵中的特定元素以匹配另一个矩阵?
【发布时间】:2021-11-11 02:13:18
【问题描述】:

我正在编写一个程序,该程序涉及我创建一个从另一个矩阵“A”编辑的矩阵“B”。两个矩阵都具有相同的大小,我只是希望对于矩阵“A”包含 1 的每个位置,矩阵“B”在该位置也包含 1。例如:

if __name__ == '__main__':
    mat_A = [[0, 0, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 0, 0]]
    R = len(mat_A)
    C = len(mat_A[1])
    mat_B = [[0]*C]*R                   #Initialise matrix B to be the same size as A

    for i in range (R):
        for j in range (C):
            if mat_A[i][j] == 1:
                mat_B[i][j] = 1
            print(mat_B)

但是,在这种情况下,它会打印出这样的输出:

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0]]

Process finished with exit code 0

这告诉我代码正在查找 mat_A[i][j] = 1 的实例,然后一起更改整个 mat_B。它不应该只影响'B'中的特定位置而不是全部吗?

感谢您的帮助。

附言以上只是我写的一个非常简单的例子来尝试调试。 if 循环中有多个复杂的步骤。

【问题讨论】:

    标签: python arrays matrix


    【解决方案1】:

    线

    mat_B = [[0]*C]*R
    

    创建一个长度为R 的列表,其中每个元素都是由零组成的同一个列表。如果您更改mat_B 的子列表之一,则将它们全部更改,因为它们都是相同的列表。您可以修复此问题,例如,如下所示:

    mat_B =  [[0]*C for i in range(R)]
    

    之后,您的代码应该可以正常工作了。

    附带说明,使用 numpy 数组更容易完成此类操作:

    import numpy as np 
    
    mat_A = np.array([[1, 2, 3], [0, 1, 7], [3, 1, 0], [0, 1, 0], [0, 2, 4]]) 
    mat_B = np.zeros_like(mat_A)
    mat_B[mat_A == 1] = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多