2

我没有使用 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)
4

2 回答 2

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

于 2012-09-28T02:24:34.113 回答
1

因为您的四个输入点是共圆的,所以底层的 Delaunay 三角剖分是不明确的;您最终可能会得到一个从 (0,0) 到 (1,1) 的“边”,或者沿着“另一个对角线”从 (1,0) 到 (0,1) 的一个“边”。

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

如果你想要那个控制,你有两个选择:

1)通过给插值器一个看起来像德劳尼三角测量返回的对象来明确提供三角测量。

2)将你的一个角落“轻推”向中心。例如,使用 (0.99999,0.99999) 代替 (1,1);这将“迫使” Delaunay 三角测量得到确定性结果。(在这种情况下,它将“强制”在另一个对角线上使用 (0,0) 到 (0.99999,0.99999) 段。)

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

于 2016-02-25T14:08:35.680 回答