在Python中将大型不规则网格插值到另一个不规则网格
问题内容:
我正在尝试使用Python将复杂值从一个不规则网格插入到另一个不规则网格。网格是二维的,有103,113个数据点。我正在使用Python
2.6.6,Scipy 0.7.2,Numpy 1.3.0,Matplotlib 0.99.3
在使用griddata的Matlab中,这大约需要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#一些数据
#个新网格
x2,y2 = np.mgrid [0.1:0.9:201j,0.1:0.9:513j]
#插值到新网格上
z2 = scipy.interpolate.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 ,:])
+ 1j * scipy.interpolate.RectBivariateSpline(x [:,0],y [0 ,:],z.imag)(x2 [:,0],y2 [0 ,:]))
这需要0.05秒。它的速度要快得多,因为即使您的网格间距不规则,只要网格是矩形的,也可以使用更有效的算法。