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数组向我推荐一个很好的解释吗?
没有看到你的rkf78函数,很难看到你的x1列表是如何被使用的。我还假设x1是一个列表或numpy数组。
关于列表和数组的事情是,当你设置一个等于另一个,即
dummy_list = x1
x1为您的列表,以dummy_list
所做的任何更改将在x1
反映,因为你没有做一个独立的副本,只创建了一个新的参考旧的。这就是为什么np.copy(x1)
可能工作;这将创建一个带有新内存ID的列表,并且对该列表所做的任何更改都不会反映在x1
中。
另一种解决方案:
from copy import deepcopy
dummy_list = deepcopy(x1)
本质上是做同样的事情之前,但也占列表中的列表。这不能与数组一起使用。
为了将来的参考,请添加一些关于您的代码中涉及该问题的元素的更多信息。
如果'x1'是一个numpy数组(而不是列表列表),'np.copy'就足够了。对于数组没有特殊的深层拷贝方法。 – hpaulj
谢谢hpaulj,我会改变我的答案来反映这一点 –
这些表达式中有太多未知变量。但我猜测'rkf78'正在改变'x1'输入。参数通过引用传递给函数,并且函数内部的更改可以出现在其外部的变量中。 – hpaulj