Python 一个numpy数组在更改另一个数组时意外更改,尽管它是分开的
我在我的大代码中发现了一个bug,并将问题简化为下面的情况 虽然在每个步骤中我只更改Python 一个numpy数组在更改另一个数组时意外更改,尽管它是分开的,python,numpy,matrix,Python,Numpy,Matrix,我在我的大代码中发现了一个bug,并将问题简化为下面的情况 虽然在每个步骤中我只更改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 ran
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
问题是,当您将值从
w2
分配回w1
时,实际上并不是将值从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
只有在修改
w1
之后,您才将w2
的副本分配给w1
,对吗?但是你不希望<代码> W1 < /代码>保持[C[1,2,3],[4],5[6],[7],[8],[9] ],你为什么不做“代码> W2= W1* 2 ?呃,是的,谢谢”SuFuff--让我们后退一步:你想做什么?我从W1的初始值开始,然后在n的每一个步骤的循环中给W2分配值,当我对它的所有元素进行计算时,我把它输入到w1,使w1等于。但是,当我第一次这样做(即w1=w2)时,每当我在循环中更改w2时,w1也会立即更改。@BrianCain原因是我想为我的代码做一个示例,这里的代码更复杂。可以以w2[i,j]=w1[i,j]+(2*i+j)代替谢谢,这是我的错误。你是否断言w1=w2[:]
使它们指向同一个对象?与列表不同。@ivan_pozdeev是的,这是正确的。通常,仅使用索引操作(例如w2[:]
)创建的numpy数组只是内存中相同基础数据的不同“视图”。这可以使用@ivan_pozdeev进行验证,该工具可以检查numpy内存管理的一些细节