numpy数组尽管更改了另一个数组却意外地意外更改
我在大型代码中发现了一个错误,并将问题简化为以下情况。
尽管在每一步中我都只更改w2
,但是在每一步中我都打印时w1
,它也会更改,因为在第一循环的结尾我将它们分配为相等。我读过这篇文章,但是写了一些,以防我w1
= w2[:]
能解决问题,但事实并非如此
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[1]=0;
# print p
-
问题是,当您将值
w1
从分配回时,w2
您实际上并没有将值从传递w1
给w2
,而是实际上是将两个变量指向 同一对象 。您遇到的问题
w1 = np.array([1,2,3]) w2 = w1 w2[0] = 3 print(w2) # [3 2 3] print(w1) # [3 2 3] np.may_share_memory(w2, w1) # True
解决方案
相反,您将需要复制 值 。使用numpy数组有两种常见的方法。
w1 = numpy.copy(w2) w1[:] = w2[:]
示范
w1 = np.array([1,2,3]) w2 = np.zeros_like(w1) w2[:] = w1[:] w2[0] = 3 print(w2) # [3 2 3] print(w1) # [1 2 3] np.may_share_memory(w2, w1) # False