The purpose is to calculate the average value (AverageU) from a starting array (StartingU)
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
The for loops that calculate the average values for AverageU
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)
Output:
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]]
The problem is why StartingU gets updated? It should be unchanged
StartingU=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
Advertisement
Answer
AverageU changed since this code, not after for loop.
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 and StartingU are the same instances. You can check it with is function.
StartingU = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) AverageU = StartingU print(StartingU is AverageU) # True
You should make a new instance as the comment said.
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 This code just makes another reference to the same object with a new name and this indicates the same memory. You can check the memory address of the variable with function id
You can compare like this.
copy_1 = StartingU copy_2 = StartingU[:] copy_3 = StartingU.copy() print(id(StartingU), id(copy_1), id(copy_2), id(copy_3))
Notice
Copy with the colon is actually a shallow copy, it copies only the reference of the nested list.