2017-04-11 41 views
0

这是怎么回事?我敢肯定,我忽略了一个简单的解决方案/事实。我只是不明白为什么我不能以这种方式将值/更改保存到NumPy数组中。为什么不附加列表反映变量更改?

>>> import numpy as np 
>>> memoize = [] 
>>> parameters = np.array([1, 2]).astype(np.float64) 
>>> memoize.append(parameters) 
>>> parameters -= np.array([0.5, -0.5]) 
>>> memoize.append(parameters) 
>>> memoize 
[array([ 0.5, 2.5]), array([ 0.5, 2.5])] 

我希望答案是

[array([ 1., 2.]), array([ 0.5, 2.5])] 

是否有什么关系的列表是可变的?

+0

不,这是因为你不断追加*相同的数组*。因此,您有一个对同一个数组的引用列表,这就是为什么对该数组的更改反映在列表中的每个点上。的确,问题是'list.append' **是**反映了变量的变化! –

+0

@ juanpa.arrivillaga男人这很棘手。是的,我看到它正在更新这两个元素。完全出乎意料。 – bjd2385

+0

我的意思是,这是Python中的* everything *工作原理。这很明显,你一遍又一遍地执行'memoize.append(参数)...... –

回答

1

您遇到的问题是parameters是一个可变值,并且您正在附加多个引用,同时对其进行了适当的修改。如果每次将变量重新映射到一个新数组,则不会有问题。

尝试改变

parameters -= np.array([0.5, -0.5]) 

parameters = parameters - np.array([0.5, -0.5]) 

的原始版本,使就地修改parameters。第二个版本使用复制数据创建一个新数组。这可能会稍微慢一些,但是在这种情况下它会做你想做的。

相关问题