Python中的快速二维插值,使用SciPy规则网格进行分散/不规则评估



我有一个训练值的规则网格(向量x和y,分别具有网格xmesh和ymesh以及zmesh的已知值),但有一组分散/粗糙/不规则的值要插值(向量xI和yI,其中我们感兴趣的是zI[0]=f(xI[0],yI[0])。。。zI[N-1]=f(xI[N-1]。作为优化问题的一部分,这种插值将被调用数百万次,因此性能太重要了,不能简单地使用生成网格并获取轨迹的方法。

到目前为止,我已经找到了一个scipy.interpolate函数,它接近我想要的,Bpf函数。然而,因为它是一个分散的输入,我认为它没有很好的性能,我想用样条曲线、线性和最近邻插值方法来测试它,我更了解它,我希望它会更快。我能找到的所有实现这些功能的方法,都以规则网格作为训练数据(如RectBivariateSpline),似乎也需要规则网格来插值。

这段代码有望让我明白我的要求。

import numpy as np
import scipy as sp
import scipy.interpolate as interp
x = np.arange(0,2*np.pi,.1)
y = x
xmesh,ymesh = np.meshgrid(x,y)
zmesh = np.sin(xmesh)+np.cos(ymesh)
rbf = interp.Rbf(xmesh, ymesh, zmesh, epsilon=2)
xI = np.arange(0,np.pi,.05)
yI = xI
XI, YI = np.meshgrid(xI,yI)
# Notice how this is happy to take a vector or grid as input   
zI = rbf(xI, yI)
ZI = rbf(XI,YI) # equiv. to zImesh
myspline = interp.RectBivariateSpline(x, y, zmesh)
# myspline takes vectors as input but makes them into meshes for evaluation 
splineoutput = myspline(xI, yI) 
# myspline returns ZI but I want zI
print(splineoutput)
print(ZI)
print(zI)

我能做些什么来使用像RectBivariateSpline这样的函数,但要得到zI(向量)而不是zI(网格)吗?或者,在替代优化方法上,是否有另一个函数族以我想要的方式工作?如果是,我应该寻找什么?

只是简单提醒一下,我正在寻找的是一种快速优化技术,用于相对较大的数据阵列(20000多个条目),网格点之间的距离较小,并且数据非常平滑。我怀疑有一种很好、简单的方法可以用现有的库来满足我的需求,但我找不到。谢谢你的帮助。

这:http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RectBivariateSpline.ev.html

myspline.ev(xI, yI)

从scipy v0.14.0开始,RectBivariateSpline.__call__()采用可选的grid=关键字参数,默认为True:

网格布尔

是在由输入数组跨越的网格上计算结果,还是在输入数组指定的点上计算结果。

所以你可以使用:

splineoutput = myspline(xI, yI, grid=False)

最新更新