Python:将 numpy.array 附加到列表 python 会覆盖之前的元素
Python: appending numpy.array to list python overwrites the previous elements
我正在尝试绘制给定势能下的恒星轨道。首先我初始化位置和速度,根据给定的势从位置推导出加速度。
然后我以定义的时间步长提前时间并计算轨道。当我尝试将计算出的位置存储在一个空列表中时,问题就出现了。这是我的代码:
## 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
,然后追加到列表中
我正在尝试绘制给定势能下的恒星轨道。首先我初始化位置和速度,根据给定的势从位置推导出加速度。
然后我以定义的时间步长提前时间并计算轨道。当我尝试将计算出的位置存储在一个空列表中时,问题就出现了。这是我的代码:
## 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
,然后追加到列表中