我需要对初始3x3阵列(比如'x')进行计算,稍后我需要再进行进一步的计算。所以,我有另一个变量('y')来复制'x'(y = x),对'y'进行计算,然后使用x进行后续处理。但不知何故,'y'的地址变为'x',即使我最初将其分配给'x'
import numpy as np
x = np.random.rand(3,3)
y = np.random.rand(3,3)
print 'y',id(y)
y = x
y[1][1] = -y[1][1]
print x[1][1] + y[1][1] #This needs to be 0.
print 'x',id(x)
print 'y',id(y)
在上面的代码中,我需要第9行('x [1] [1] + y [1] [1]'),打印0,但给出的是2次-x [1] [1 ]。这个问题背后的原因是什么,如果你可以建议一些方法来避免这个问题?
答案 0 :(得分:1)
因为y=x
仅复制引用,而不会创建数组的另一个副本
您应该用
替换该行y = x[:]
否则,更改x
也会更改y
,反之亦然。
但是,此方法仅适用于常规list
而非numpy
数组。这是可能的(也更明确和可读):
y = np.copy(x)
如果你想自己检查一下,你可以在完成任务后print id(y)
和print id(x)
,看看在你的情况下它们是相同的,而在真实副本中它们是不同的