#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