2011-10-09 391 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,它效果很好,謝謝! –