我在做一个模拟,我有很多粒子,每个粒子都有一个位置和一个速度。对于每个时间步,我根据速度计算一个新的位置,并将该位置添加到列表中,这样我就可以得到以前位置的列表。我想用它来检查粒子的路径。问题是每次程序计算新位置时,路径列表中的所有条目都会更改为新计算的数组。例如代码
pos = array([0,0,0])
vel = array([1,1,1])
time_step = 1
path = []
path.append(pos)
for i in range(3):
pos += vel*time_step
path.append(pos)
print path
生成输出
[array([1, 1, 1]), array([1, 1, 1])]
[array([2, 2, 2]), array([2, 2, 2]), array([2, 2, 2])]
[array([3, 3, 3]), array([3, 3, 3]), array([3, 3, 3]), array([3, 3, 3])]
最奇怪的是,当使用append时,它们似乎没有改变,而是在计算新位置时改变了。例如,写作
pos = array([0,0,0])
vel = array([1,1,1])
time_step = 1
path = []
path.append(pos)
pos += vel*time_step
print path
不附加新位置仍会生成
[array([1,1,1])]
而不是预期的
[array([0,0,0])].
有人知道为什么会发生这种情况,以及我如何避免这种情况吗
改用
path.append(np.copy(pos))
。数组中的所有元素都指向内存中的同一空间,因此,如果更改此内存空间中的值,所有这些指针都将指向这些新值。为了避免这种情况,您只需要使用np.copy
将numpy数组的值复制到内存中的新空间编辑: 既然您使用了
from numpy import *
,您可以只使用copy()
相关问题 更多 >
编程相关推荐