【发布时间】: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