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

2 投票
1 回答
7318 浏览
提问于 2025-04-17 03:58

我正在尝试用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,就会出现内存错误,即使我只处理实部也会这样:

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,大家知道这个能处理大规模不规则网格吗?

1 个回答

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秒。它快得多,因为即使你的网格间距不规则,只要网格是矩形的,就可以使用更高效的算法。

撰写回答