scipy.interpolate.interp1d线性插值时,我遇到以下行为:

from scipy.interpolate import interp1d
import numpy as np
x = [0,1,2,3,4]
y = [np.inf, 10, 12, 11, 9]
interpolated_function = interp1d(x,y)


当然,现在当然没有在[0,1)中很好地定义插值,但是在1上我希望可以定义它。然而:

In[2]:  interpolated_function(1.)
        C:\WinPython27\python-2.7.10\lib\site-packages\
        scipy\interpolate\interpolate.py:469:
        RuntimeWarning: invalid value encountered in add
        y_new = slope*(x_new - x_lo)[:, None] + y_lo
Out[2]: array(nan)

In[3]:  interpolated_function(1.000000000000001)
Out[3]: array(10.000000000000002)


这是预期的行为吗?不应将1处的插值函数评估为10,因为这是传递给interp1d的完全有效的数据点?

最佳答案

interp1d不是naninf的特殊情况。对于kind="linear",它仅使用包含输入值的时间间隔上的错误消息中打印的公式。

由于精确的相等在浮点中并不可靠,因此通过在1.0处进行评估,您将依赖于实现详细信息,该实现详细信息将其分类为(0,1)或(1,2)。

例如,

In [26]: np.interp(1, x, y)
Out[26]: 10.0

In [32]: interp1d(x, y, kind='slinear')(1.)
Out[32]: array(10.0)


在scipy的未来版本中,行为将取决于fill_value。 (在当前的开发版本中,您可以使用fill_value="extrapolate"。)

最好的办法是在用户端过滤掉非限定数字。

In [33]: x, y = map(np.asarray, (x, y))

In [34]: mask = np.isfinite(x) & np.isfinite(y)

In [35]: ii = interp1d(x[mask], y[mask])

In [36]: ii(1.)
Out[36]: array(10.0)

10-01 02:03