使用SciPy在Python中进行快速二维插值:从规则网格到散乱/不规则评估

11

我有一组训练值的规则网格(向量 x 和 y,分别具有相应的网格 xmesh 和 ymesh,并且已知 zmesh 的值),但是要插值的值是散乱/不规则的(向量 xI 和 yI,我们关注的是 zI[0] = f(xI[0], yI[0]) ... zI[N-1] = f(xI[N-1], yI[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(网格)?或者,是否有另一类函数可以在替代优化方法上按照我想要的方式工作?如果有,我应该寻找什么?
只是一个快速提醒,我正在寻找一种快速的优化技术,适用于相对较大的数据数组(20,000+条目),网格点之间的距离很小,并且数据相当平滑。我怀疑现有的库中有一种很好、简单的方法可以满足我的需求,但我找不到。感谢帮助。
2个回答

10

那似乎正是我想要的。我知道有一些内置的东西可以帮助。谢谢! - BKay
还可以参考这个回答来处理n维情况:https://dev59.com/hGQn5IYBdhLWcg3wP1JT - j13r

4
从scipy v0.14.0开始,RectBivariateSpline.__call__()接受一个可选的grid=关键字参数,默认值为True

gridbool

是否在由输入数组跨越的网格上评估结果,或者在由输入数组指定的点上评估结果。

因此,您可以使用:
splineoutput = myspline(xI, yI, grid=False)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接