繁体   English   中英

Python:将 numpy.array 附加到列表 python 会覆盖之前的元素

[英]Python: appending numpy.array to list python overwrites the previous elements

我正在尝试 plot 一个给定势能的恒星轨道。 首先,我初始化 position 和速度,并根据给定的势从 position 推导出加速度。

然后我以定义的时间步长提前时间并计算轨道。 当我尝试将计算出的位置存储在一个空列表中时,问题就出现了。 这是我的代码:

## Initial position, velocity, and acceleration
r = np.array([20., 20., 0.])
v = np.array([0., 1., 0.])
g = acc(*r) #calculates acceleration from a function

## empty list to store position data
posdata = []

## Orbit integration
dt = 0.1
for t in np.arange(0, 1000, dt):
    v += 0.5 * g * dt
    r += v * dt
    if t%100 == 0:
        print(r) #check if r actually changes
    g = acc(*r)
    v += 0.5 * g * dt
    posdata.append(r)

这就是我期望得到的:

posdata
>>> [array([19.999875, 20.099875,  0.]), array([19.99950125, 20.19950001,  0.]), array([19.99887999, 20.29887502,  0.]), ...]

但我实际上得到了这个:

>>> [array([-17.57080611, -34.03696644,   0.]), array([-17.57080611, -34.03696644,   0.]), array([-17.57080611, -34.03696644,   0.])]

所有元素都与计算的最后一个元素相同。 如您所见,我检查了r是否真的发生了变化,确实发生了变化。 我认为这与r是一个数组这一事实有关,但我不知道如何纠正这个问题。

每次创建对同一对象的许多引用的列表时,都将添加同一对象。

[r, r, r, r, r, r, r]

由于对象是可变的,因此在更新对象时,更改会影响整个引用列表。

将对象追加到列表时,需要创建该对象的副本。

试试这个

posdata.append(r.copy())

现在,每个列表位置中将有一个不同的对象。

[r1, r2, r3, r4, r5, r6, r7]

当您将数组r附加到列表时,仅数组对象的引用被附加。 并且由于numpy.array对象是可变的,因此所有引用都就地更新。 为此,您可以

  • 将数组作为列表追加到posdata作为列表

posdata.append(r.tolist())

要么

  • 将数组作为新的numpy.array对象追加到posdata

    posdata.append(np.array(r))

我遇到了同样的问题。 我的解决方案是将等式r += v * dt中的+=更改为r = r + v * dt ,然后将 append 添加到列表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM