Python 一个numpy数组在更改另一个数组时意外更改,尽管它是分开的

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

我在我的大代码中发现了一个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 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内存管理的一些细节