【问题标题】:scipy.interp2d warning and large errors off the gridscipy.interp2d 警告和离网的大错误
【发布时间】:2016-04-07 15:08:26
【问题描述】:

我正在尝试插入一个二维函数,我遇到了我认为 scipy.interpolate.interp2d 的奇怪行为。我不明白问题出在哪里,我很乐意提供任何帮助或提示。

import numpy as np
from scipy.interpolate import interp2d

x = np.arange(10)
y = np.arange(20)
xx, yy = np.meshgrid(x, y, indexing = 'ij')
val = xx + yy
f = interp2d(xx, yy, val, kind = 'linear')

当我运行此代码时,我收到以下警告:

scipy/interpolate/fitpack.py:981:RuntimeWarning:不能再打结 添加是因为 B 样条系数的数量已经超过 数据点数 m。可能原因: s 或 m 太小。 (fp>s) kx,ky=1,1 nx,ny=18,15 m=200 fp=0.000000 s=0.000000
warnings.warn(RuntimeWarning(_iermess2[ierm][0] + _mess))

我不明白为什么 interp2d 在我告诉它应该进行线性插值时会使用任何样条曲线。当我继续并在网格上评估 f 时,一切都很好:

>>> f(1,1)
array([ 2.])

当我在网格外评估它时,我会得到很大的错误,即使函数显然是线性的。

>>> f(1.1,1)
array([ 2.44361975])

我有点困惑,我不确定问题出在哪里。有没有人遇到过类似的问题?我曾经使用matlab,这几乎是我在那里做的1:1,但也许我做错了什么。

当我使用矩形网格(即 y = np.arange(10))时,顺便说一句,一切正常,但这不是我需要的。当我使用三次而不是线性插值时,误差会变小(这也没有多大意义,因为函数是线性的)但仍然大得无法接受。

【问题讨论】:

  • 它的文档说:This class returns a function whose call method uses spline interpolation to find the value of new points. 差的外插是样条插值的特征。他们还为常规网格提出建议。
  • 感谢您的回答。在我的理解中,线性样条只是分段线性插值,还是我错了?我不推断,(1.1,1)在数据范围内。而且我的网格是规则的,不是吗?
  • 你试过了吗:ff=interpolate.interp2d(y,x,xx+yy,kind='linear')? (检查有关行/列坐标的文档)。
  • interp2d 使用:interpolate.bisplrep(...., kx=1, ky=1),即“曲面的二元 B 样条表示”。这与一堆分段线性平面不同。有一个 MATLAB b-spline 可能表现相同(并且可能有更多文档)。

标签: python numpy scipy interpolation


【解决方案1】:

我尝试了几件事,并设法使用 scipy.LinearNDInterpolator 获得(某种)我想要的东西。但是,我必须将网格转换为点和值列表。由于我的程序的其余部分以网格格式存储坐标和值,这有点烦人,所以如果可能的话,我仍然希望原始代码能够正常工作。

import numpy as np
import itertools
from scipy.interpolate import LinearNDInterpolator

x = np.arange(10)
y = np.arange(20)
coords = list(itertools.product(x,y))
val = [sum(c) for c in coords]
f = LinearNDInterpolator(coords, val)

>>>f(1,1)
array(2.0)

>>> f(1.1,1)
array(2.1)

【讨论】:

  • 将网格重塑为点并不难。你可以制作points=np.column_stack([xx.ravel(),yy.ravel()])val=(xx+yy).ravel()
  • 谢谢,这很有用,那我就用这个选项。知道为什么 interp2d 在插值线性函数方面表现不佳仍然会很有趣。
  • LinearNDIterpolator 使用 Qhull 对曲面进行三角剖分,并使用适当的三角平面进行线性插值。它接近于 MATLAB interp2d 线性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2018-12-31
  • 2011-07-29
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多