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])。这个插值将被称为百万次作为优化问题的一部分,因此性能太重要了,不能简单地使用一种方法来制作网格并进行跟踪。

到目前为止,我已经能够找到一个接近我想要的 Bpf 函数的 scipy.interpolate 函数。然而,因为它讲述了分散的输入,我认为它没有很好的性能,我想用我更好理解的样条、线性和最近邻插值方法来测试它,我希望它会更快。我能找到的所有实现这些的方法,将常规网格作为训练数据(如 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 多个条目),网格点之间的距离较小,并且数据非常平滑。我怀疑有一种很好、简单的方法可以用现有的库来做我需要的事情,但我找不到它。感谢您的帮助。

4

2 回答 2

10

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

IEmyspline.ev(xI, yI)

于 2012-07-30T21:16:02.600 回答
4

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

网格布尔

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

所以你可以使用:

splineoutput = myspline(xI, yI, grid=False)
于 2015-11-25T15:36:03.857 回答