scipy.interpolate.LinearNDInterpolator不能产生所需的功能

时间:2012-09-28 02:11:37

标签: python scipy multidimensional-array linear-interpolation

我没有使用LinearNDInterpolator获得所需的2D线性插值功能。下面的代码试图在4个结点(0,0),(1,0),(0,1),(1,1)之间进行插值。 interp2d给出了预期的(线性插值)结果,但是LinearNDInterpolator正在做其他事情,我无法弄清楚。也许我没有正确使用API​​。不幸的是,我找不到有关用法的详细文档。有人可以请求帮助或指向正确的论坛(mathoverflow?)写信吗?

>>> f = interp2d([0,1,0,1], [0,0,1,1], [0,1,2,4])
>>> f(0.5,0.5)
array([ 1.75])
>>> g = LinearNDInterpolator([[0,0],[1,0],[0,1],[1,1]], [0,1,2,4])
>>> g(0.5,0.5)
array(2.0)

2 个答案:

答案 0 :(得分:6)

来自http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.LinearNDInterpolator.html

  

通过用Qhull [R15]对输入数据进行三角测量,并在每个执行线性重心插值的三角形上构造插值。

在您的情况下,所选的三角形似乎共享(0,0), (1,1)边缘。由于(0.5, 0.5)位于(0,0)(1,1)之间,因此内插值位于这些顶点的值之间,因此它是(0+4)/2 = 2.0

答案 1 :(得分:1)

因为你的四个输入点是共同循环的,所以潜在的Delaunay三角剖分是模糊的;你最终会得到一个从(0,0)到(1,1)的“边缘”,或者沿着“另一个对角线”,从(1,0)到(0,1)。

在第一种情况下,(0.5,0.5)的插值将产生2.0,在后一种情况下,它将产生1.5。你无法控制你得到的那个。

如果您想要该控件,您有两种选择:

1)通过给内插器一个看起来像Delauney三角测量返回的对象,明确地提供三角测量。

2)“轻推”你的一个角落向中心。例如,使用(0.99999,0.99999)而不是(1,1);这将“强迫”德劳内三角测量结果达到确定性结果。 (在这种情况下,它会“强制”使用(0,0)到(0.99999,0.99999)段而不是另一个对角线。)

而且,FWIW,我认为这两个可能值(1.5和2.0)的平均值是你在使用双线性插值时观察到的并不是巧合。我认为这是数学上的预期。