【发布时间】:2022-07-25 20:32:21
【问题描述】:
我目前正在使用 interp2D 插入 2D 数据网格。简而言之,我的代码运行缓慢。我正在使用 interp2D 在许多不同的时间步长上对 2D 网格上的数据进行插值 - 每次插值大约需要 1.5 秒,而且由于我有数千个时间步长,这太慢了。我尝试过使用 griddata 但这也需要类似的时间。我想知道是否有更快的方法在 python 中插入网格数据?
我正在做的更多细节:我正在对每个时间步长在网格点处发现的粒子速度进行插值。我有一个二维网格,其中的数据取决于时间步长 - 即网格上同一位置的速度在每个时间步长后都会发生变化。我从均匀分布的网格上的粒子开始。然后我使用插值速度将粒子移动到新坐标。然后我在下一个时间步中插入这些新坐标处的速度并重复这个过程。
我的代码如下:
xx,yy = np.meshgrid(x,y,indexing='ij')
Ntime = np.shape(U)[0]
U_prtcl = np.zeros((Ntime, np.shape(xx)[0], np.shape(yy)[1]))
xcords = xx
ycords = yy
for ts in range(Ntime):
U_pad[1:-1,1:-1] = U[ts,:,:]
U_pad[0,:] = U_pad[-2,:]
U_pad[-1,:] = U_pad[1,:]
U_pad[:,0] = U_pad[:,-2]
U_pad[:,-1] = U_pad[:,1]
x_vel_ts = np.vectorize(scipy.interpolate.interp2d(x=x_pad,y=y_pad, z=U_pad,kind = 'cubic'))
U_velocity = x_vel_ts(xcords,ycords)
xcords += dt*U_velocity
U_prtcl[ts,:,:] = U_velocity
以下是对我的变量的一些解释:
U 是一个 3D 数组,其维度为时间步长、x 坐标、y 坐标。因此,它在每个时间步长存储二维坐标网格上的点的速度。
x 和 y 是一维数组,表示坐标网格的 x 和 y 轴。
U_pad 是每个时间步长的 2D 坐标网格 - 但它已在两侧填充。所以它只是带有一点额外内容的 2D 网格。我用它来进行插值。 x_pad 和 y_pad 是 x 和 y 轴,但也在两侧填充。 (由于周期性边界条件,填充是必要的)
U_prtcl 只是用于存储我在每个时间步中通过插值获得的值。 U_prtcl[t][i][j] 存储最初在网格点 (i,j) 开始的粒子在时间 t 的速度。
【问题讨论】:
标签: python numpy scipy coordinates interpolation