在Python中将大型不规则网格插入到另一个不规则网格上



我正在尝试使用Python从一个不规则网格插入到另一个不规则网格的复杂值。网格是二维的,有103,113个数据点。我使用Python 2.6.6, Scipy 0.7.2, Numpy 1.3.0, Matplotlib 0.99.3

在Matlab中使用griddata可以在大约5秒内实现。

BnGRID2  = griddata(R_GRID1,Z_GRID1,BnGRID1,R_GRID2,Z_GRID2) (MATLAB)

(注意所有数组都是201 x 513)

但是,如果我尝试使用matplotlib.mlab.griddata,即使我尝试仅使用实数部分工作,我也会得到memoryError:

mlab.griddata(R_GRID1.flatten(),Z_GRID1.flatten(),num.real(BnGRID1.flatten()),R_GRID2.flatten(),Z_GRID2.flatten())

如果我尝试使用interp2d,我得到一个分段错误和Python退出:

a = interp.interp2d(R_GRID1,Z_GRID1,num.real(BnGRID1))

我尝试过使用KDTree,这似乎工作得很好,然而,与Matlab的几秒钟相比,它需要几分钟,但我还没有过多地探索这个选项。

想知道是否有人有任何想法,我如何能尽快完成Matlab似乎?我注意到新版本的Scipy也有griddata,有人知道这是否可以处理大型不规则网格吗?

Scipy的griddata似乎能够毫无问题地处理这种大小的数据集:

<>之前导入numpy为np进口scipy.interpolate#旧网格X y = np。mgrid [0:1:201j 0:1:513j]Z = np.sin(x*20) * (1j + np.cos(y*3))**2 #一些数据# new gridX2, y2 = np.mgrid[0.1:0.9:201j, 0.1:0.9:513j]#插值到新的网格上Z2 = scipy. interpolated .griddata((x.ravel(), y.ravel()), z.ravel(), (x2, y2), method='cubic')之前

在旧的AMD Athlon上,griddata步骤大约需要5秒。

如果你的数据在网格上(即,值z[i,j]对应的坐标是(x[i], y[j])),你可以通过使用scipy.interpolate.RectBivariateSpline

获得更快的速度<>之前z3 = (scipy.interpolate.RectBivariateSpline (x (:, 0), y [0,:], z.real) (x2: 0, y2 [0,:])+ 1 j * scipy.interpolate.RectBivariateSpline (x [: 0], [0,:], z.imag) (x2: 0, y2 [0,:]))之前

耗时0.05s。它要快得多,因为即使你的网格间距是不规则的,只要网格是矩形的,就可以使用更有效的算法。

最新更新