附加到NumPy(Python)数组

2024-10-17 10:20:51 发布

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

首先,我在三自由度纽比阵列上做一个龙格库塔。我的阵列是这样的:

状态=[[X]、[Vx]、[Y]、[Vy]、[Z]、[Vz]]

我运行Runge-Kutta,得到四个K值,然后用[newaxis]进行转置。因此,当我尝试将新状态追加到states数组时,如下所示:

states = append(states, states[:,i] + (K1.T + 2 * K2.T + 2 * K3.T + K4.T)/6, 1)

其中“i”是一个从0开始并为每次迭代累加的计数器。在

但是,当我运行我的代码时,我的结果状态数组不是由六个元素组成的两列。似乎我在向states数组追加一个行向量而不是一个列向量。我在列中使用两个元素(X,Vx)运行代码,所有的附加都很好(或者至少我的结果是有意义的)。在

我曾试图将Runge-Kutta的结果强制为列向量,但这会扰乱K值的计算。我尝试过我的append代码的变体,结果仍然相同。在

这是一个Matlab代码的克隆,我在NumPy数组和索引上找不到任何对我有帮助的东西。在

感谢任何帮助。在

谢谢。在

更新: states[:,0] = [[0], [2300], [0], [0], [-1600], [500]]-原始 states[:,1] = [[2300], [2100], [0], [0], [-2100], [450]]-附加 states = [[0, 2300], [2300, 2100], [0, 0], [0, 0], [-1600, -2100], [500, 450]]-最终版本 这些是列向量。在


Tags: 代码元素状态k2k1数组向量runge
2条回答

由于效率问题,如果可以避免的话,不应该追加数组。追加意味着更改分配的内存大小,这可能会占用不连续的内存空间,因此需要低效的分配或重新分配。这会大大降低程序的速度,特别是对于大型数组。在

如果你要实现一个固定的时间步长Runge Kutta,你事先就知道你的解在时间T时会有多少个点。它是N=(T-t0)/h+1,其中T是最后一个时间,t0是初始时间,h是时间步。您可以用零初始化数组(使用states = np.zeros((N,3))),并在执行过程中填充值,将索引i与时间t[i] = t0 +i*h关联起来。这将在循环内: states[:,i+1] = states[:,i] + RK4_step(states[:,i]), 其中RK4_step(states[:,i])是一个函数,返回一个数组(列),其中包含Runge-Kutta方法的一个步骤中状态值的变化。在

即使您的时间步长是可变的,您仍然应该这样做,但是时间不均匀t[i] = t0 +i*h。在

或者,您可以使用numpy.integrate.ode_int(),它在需要的时间返回一个ODE的解决方案。在

您应该堆叠它们,而不是appending它们。在

numpy documentation开始,您应该使用其中一个堆栈方法,例如:np.vstack

a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
c = np.vstack((a,b))
print(c)
# array([[1, 2, 3],
#        [2, 3, 4]])

或者根据您得到的数据,还有np.hstack(沿第一个轴堆叠)和{}(沿第三个轴堆叠)。在

相关问题 更多 >