目的是從一個起始陣列(StartingU)計算平均值(AverageU)
import numpy as np
AverageU=np.zeros((3,3))
StartingU=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
size=2
stride=1
m, n = StartingU.shape
print("Before averaging:")
print("AverageU=", AverageU)
print("StartingU=", StartingU)
AverageU = StartingU
計算 AverageU 平均值的 for 回圈
for i in range(0, m - size 1, stride):
for j in range(0, n - size 1, stride):
avg = np.sum(np.sum(AverageU[i:i size, j:j size])) / (size * size)
for ii in range(i, i size):
for jj in range(j, j size):
AverageU[ii, jj] = avg
#print("In for loop, StartingU=", StartingU)
print("After averaging:")
print("AverageU=", AverageU)
print("StartingU=", StartingU)
輸出:
Before averaging:
AverageU= [[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
StartingU= [[1 2 3]
[4 5 6]
[7 8 9]]
After averaging:
AverageU= [[3 3 3]
[5 5 5]
[5 5 5]]
StartingU= [[3 3 3]
[5 5 5]
[5 5 5]]
問題是為什么 StartingU 會更新?應該不變
StartingU=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
uj5u.com熱心網友回復:
自從這段代碼以來,AverageU 發生了變化,而不是在 for 回圈之后。
print("Before averaging:")
print("AverageU=", AverageU)
print("StartingU=", StartingU)
AverageU = StartingU # since here, AverageU variable changed
print("AverageU=", AverageU)
print("StartingU=", StartingU) # please check here again.
AverageU 和 StartingU 是相同的實體。您可以使用 is 函式檢查它。
StartingU = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
AverageU = StartingU
print(StartingU is AverageU) # True
正如評論所說,您應該創建一個新實體。
StartingU = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
AverageU_new1 = StartingU[:]
AverageU_new2 = StartingU.copy()
print(StartingU is AverageU_new2) # False
print(StartingU is AverageU_new1) # False
AverageU = StartingU此代碼只是用新名稱再次參考同一個物件,這表示相同的記憶體。您可以使用函式id檢查變數的記憶體地址
你可以這樣比較。
copy_1 = StartingU
copy_2 = StartingU[:]
copy_3 = StartingU.copy()
print(id(StartingU), id(copy_1), id(copy_2), id(copy_3))
注意
帶冒號的拷貝其實是淺拷貝,它只拷貝嵌套串列的參考。
uj5u.com熱心網友回復:
感謝Lazyer的建議。通過嘗試AverageU=StartingU.copy(),我得到了解決方案。是的你是對的。
實際上,下面的簡化代碼顯示了正確的答案。
import numpy as np
A=np.array([[1, 2, 3], [4, 5, 6],[7, 8, 9]])
# B=A[:] this one still gets A updated
B=A.copy()
for i in range(0,3):
for j in range(0,3):
B[i,j]=2
print("A=",A)
print("B=", B)
輸出:
A= [[1 2 3]
[4 5 6]
[7 8 9]]
B= [[2 2 2]
[2 2 2]
[2 2 2]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494946.html
下一篇:變數變化時觸發函式
