I found a bug in my large code, and I simplified the issue to the case below.
Although in each step I only change
w2, but when at each step I print out
w1, it is also changed, because end of the first loop I assign them to be equal.
I read for this but there was written in case I make
w1 = w2[:] it will solve the issue but it does not
import numpy as np import math w1=np.array([[1,2,3],[4,5,6],[7,8,9]]) w2=np.zeros_like(w1) print 'w1=',w1 for n in range(0,3): for i in range(0,3): for j in range(0,3): print 'n=',n,'i=',i,'j=',j,'w1=',w1 w2[i,j]=w1[i,j]*2 w1=w2[:] #Simple tests # w=w2[:] # w1=w[:] # p=[1,2,3] # q=p[:]; # q=0; # print p
The issue is that when you’re assigning values back to
w2 you aren’t actually passing the values from
w2, but rather you are actually pointing the two variables at the same object.
The issue you are having
w1 = np.array([1,2,3]) w2 = w1 w2 = 3 print(w2) # [3 2 3] print(w1) # [3 2 3] np.may_share_memory(w2, w1) # True
Instead you will want to copy over the values. There are two common ways of doing this with numpy arrays.
w1 = numpy.copy(w2) w1[:] = w2[:]
w1 = np.array([1,2,3]) w2 = np.zeros_like(w1) w2[:] = w1[:] w2 = 3 print(w2) # [3 2 3] print(w1) # [1 2 3] np.may_share_memory(w2, w1) # False