【问题标题】:Interp2d too slow on large gridInterp2d 在大网格上太慢
【发布时间】: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 坐标。因此,它在每个时间步长存储二维坐标网格上的点的速度。

xy 是一维数组,表示坐标网格的 x 和 y 轴。

U_pad 是每个时间步长的 2D 坐标网格 - 但它已在两侧填充。所以它只是带有一点额外内容的 2D 网格。我用它来进行插值。 x_pady_pad 是 x 和 y 轴,但也在两侧填充。 (由于周期性边界条件,填充是必要的)

U_prtcl 只是用于存储我在每个时间步中通过插值获得的值。 U_prtcl[t][i][j] 存储最初在网格点 (i,j) 开始的粒子在时间 t 的速度。

【问题讨论】:

    标签: python numpy scipy coordinates interpolation


    【解决方案1】:

    尝试阅读这篇文章How can I perform two-dimensional interpolation using scipy?

    有很多关于 Scipy 插值的信息,尤其是关于 RBF,它通常比 interp2d 更好

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 2019-01-28
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多