2011-10-09 394 views
2

我想从一个不规则网格插值到另一个使用Python的不规则网格。网格是2D的,有103,113个数据点。我使用Python 2.6.6,Scipy 0.7.2,Numpy 1.3.0,Matplotlib 0.99.3将大型不规则网格插值到Python中的另一个不规则网格

在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)) 

我曾尝试使用设g KDTree和这似乎工作正常,但是,它需要几分钟与Matlab的几秒钟,但我还没有探索这个选项太多。

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

回答

6

SciPy的公司的GridData似乎能够处理的数据集这种规模的没有问题:

 
import numpy as np 
import scipy.interpolate 

# old grid 
x, y = np.mgrid[0:1:201j, 0:1:513j] 
z = np.sin(x*20) * (1j + np.cos(y*3))**2 # some data 

# new grid 
x2, y2 = np.mgrid[0.1:0.9:201j, 0.1:0.9:513j] 

# interpolate onto the new grid 
z2 = scipy.interpolate.griddata((x.ravel(), y.ravel()), z.ravel(), (x2, y2), method='cubic') 

的一步的GridData大约需要一个旧的AMD Athlon 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.05s。这要快得多,因为即使网格间距不规则,只要网格是矩形的,就可以使用更高效的算法。

+0

我试过新的scipy griddata,它效果很好,谢谢! –