在计算(而不是追加)下一个要添加的数组时,如何避免numpy数组更改的列表中的所有条目?

2024-04-25 18:04:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个模拟,我有很多粒子,每个粒子都有一个位置和一个速度。对于每个时间步,我根据速度计算一个新的位置,并将该位置添加到列表中,这样我就可以得到以前位置的列表。我想用它来检查粒子的路径。问题是每次程序计算新位置时,路径列表中的所有条目都会更改为新计算的数组。例如代码

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])].

有人知道为什么会发生这种情况,以及我如何避免这种情况吗


Tags: pathpos路径程序列表timestep时间
1条回答
网友
1楼 · 发布于 2024-04-25 18:04:32

改用path.append(np.copy(pos))。数组中的所有元素都指向内存中的同一空间,因此,如果更改此内存空间中的值,所有这些指针都将指向这些新值。为了避免这种情况,您只需要使用np.copy将numpy数组的值复制到内存中的新空间

编辑: 既然您使用了from numpy import *,您可以只使用copy()

相关问题 更多 >