我正在尝试使用Python将复杂值从一个不规则网格插入到另一个不规则网格中。网格是2D的,有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,有没有人知道这是否可以处理大的不规则网格?
答案 0 :(得分: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')
对于旧的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秒。它的速度要快得多,因为即使网格间距不规则,只要网格是矩形的,就可以使用更有效的算法。