Как изменить определенный элемент в матрице, чтобы он соответствовал другой матрице?

#python #arrays #matrix

Вопрос:

Я пишу программу, которая предполагает, что я создам матрицу «В», отредактированную из другой матрицы «А». Обе матрицы имеют одинаковый размер, и я просто хочу, чтобы для каждой позиции, где матрица » 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 вместе. Разве это не должно влиять только на конкретную позицию в «В», а не на все?

Спасибо вам за вашу помощь.

p.s. Выше приведен только очень простой пример, который я написал, чтобы попытаться отладить. В цикле if есть несколько сложных шагов.

Ответ №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