scipy中的interp1d如何处理关系

时间:2016-06-25 23:21:54

标签: python scipy

scipy.interpolate.interp1d的文档没有说明当x参数中存在联系时会发生什么。我的实验表明,当请求精确的x值时,它返回最右边的一个,并在插值时使用最接近的值:

from scipy.interpolate import interp1d
temp = interp1d([0, 1, 1, 2], [1, 2, 3, 4])
temp(0.5)  # 1.5
temp(1)  # 3.0
temp(1.5)  # 3.5

内插器的设计能保证吗?

2 个答案:

答案 0 :(得分:1)

interp1dscipy/interpolate/interpolate.py中定义。对于默认的'线性'它似乎有两种选择。

            # Check if we can delegate to numpy.interp (2x-10x faster).
            if (not np.issubdtype(self.y.dtype, np.complexfloating) and
               self.y.ndim == 1 and
               not _do_extrapolate(fill_value)):
                self._call = self.__class__._call_linear_np
            else:
                self._call = self.__class__._call_linear

call_linear_np确实:

np.interp(x_new, self.x, self.y)

该函数调用编译代码。文档谈到期望xp增加,但实际上并没有检查这个。

def _call_linear(self, x_new):

似乎是所有Python,你可以学习。

您所描述的是我对线性插值所期望的。但请记住,此代码与浮点数一起运行,并且“完全相同”'浮动不保证。

答案 1 :(得分:1)

不,不能保证。

x值中存在关联时插值器的行为未定义,并且可能在scipy版本之间发生变化。 (插值类型和数组中的位置也是关系)。