附加到NumPy(Python)数组

时间:2016-03-15 23:57:39

标签: python arrays numpy

首先,我在三自由度NumPy阵列上做Runge-Kutta。我的数组看起来像这样:

states = [[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开始并为每次迭代计数的计数器。

然而,当我运行我的代码时,我得到的状态数组不是两列六个元素。看来我正在向行数量追加行向量而不是列向量。我在列中运行了两个元素(X,Vx)的代码,并且所有内容都很好(或者至少我的结果是有意义的)。

我试图强迫我的Runge-Kutta的结果成为一个列向量,但这会弄乱我对K值的计算。我尝试过我的附加代码的变体,但仍然有相同的结果。

这是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]] - 决赛 这些是列向量。

2 个答案:

答案 0 :(得分:1)

您应该堆叠它们而不是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(沿第一轴堆叠)和np.dstack(沿第三轴堆叠)。

答案 1 :(得分:0)

如果可以避免,由于效率问题,您不应追加数组。追加意味着改变分配的内存大小,这可能会遇到非连续的内存空间,因此需要进行低效的分配或重新分配。这些可能会大大减慢您的程序速度,特别是对于大型阵列。

如果您正在实施一个固定的时间步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的解决方案。