2015-11-20 2 views
1

Когда интерполяционные линейно с scipy.interpolate.interp1d я сталкиваюсь следующее поведение:Scipys 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?

ответ

2

interp1d не специальный чехол nan б/у inf б/у. Для 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. (В текущей версии dev вы можете использовать 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) 
+0

Спасибо! К сожалению, я не могу удалить бесконечные бесконечности из-за несвязанных причин. – stebu92

Смежные вопросы