Numpy无法控制阵列的更改

问题描述:

y[:,2] = np.ravel(rkf78(neq,ti,(ti-step),(step/50),tetol,x1)) 

如果我在此行前后打印x1,我会得到不同的结果。更具体地说,x1这一行后的值等于y[:,2]Numpy无法控制阵列的更改

y[:,2] = np.ravel(rkf78(neq,ti,(ti-step),(step/50),tetol,(np.copy(x1)))) 

我发现这个解决办法,但这个事情有关数组变化似乎导致了我很多麻烦。任何人都可以用numpy数组向我推荐一个很好的解释吗?

+0

这些表达式中有太多未知变量。但我猜测'rkf78'正在改变'x1'输入。参数通过引用传递给函数,并且函数内部的更改可以出现在其外部的变量中。 – hpaulj

没有看到你的rkf78函数,很难看到你的x1列表是如何被使用的。我还假设x1是一个列表或numpy数组。

关于列表和数组的事情是,当你设置一个等于另一个,即

dummy_list = x1 

x1为您的列表,以dummy_list所做的任何更改将在x1反映,因为你没有做一个独立的副本,只创建了一个新的参考旧的。这就是为什么np.copy(x1)可能工作;这将创建一个带有新内存ID的列表,并且对该列表所做的任何更改都不会反映在x1中。

另一种解决方案:

from copy import deepcopy 
dummy_list = deepcopy(x1) 

本质上是做同样的事情之前,但也占列表中的列表。这不能与数组一起使用。

为了将来的参考,请添加一些关于您的代码中涉及该问题的元素的更多信息。

+0

如果'x1'是一个numpy数组(而不是列表列表),'np.copy'就足够了。对于数组没有特殊的深层拷贝方法。 – hpaulj

+0

谢谢hpaulj,我会改变我的答案来反映这一点 –