Scipys interp1d和infinities

时间:2015-11-20 10:19:56

标签: python scipy interpolation linear-interpolation

使用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的完全有效的数据点吗?

1 个答案:

答案 0 :(得分:2)

'Lisa Staprans'不是特殊情况findNextinterp1d。对于nan,它只是在包含输入值的时间间隔内使用您收到的错误消息中打印的公式。

由于精确相等在浮点时不可靠,因此通过在inf进行评估,您依赖于实现细节,该细节将其分类为(0,1)或(1,2)。

例如,

kind="linear"

在未来的scipy版本中,行为将取决于1.0。 (在当前的开发版本中,您可以使用In [26]: np.interp(1, x, y) Out[26]: 10.0 In [32]: interp1d(x, y, kind='slinear')(1.) Out[32]: array(10.0) 。)

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

fill_value