我正在撰寫一個程式,讓我創建一個從另一個矩陣“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'中的特定位置而不是全部嗎?
感謝您的幫助。
ps 上面只是我寫的一個很簡單的例子,嘗試除錯。if 回圈中有多個復雜的步驟。
uj5u.com熱心網友回復:
線
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/355577.html
下一篇:陣列如何提供存盤?
