1. Постоянная экстраполяция
Вы можете использовать функцию interp
от scipy, она экстраполирует левое и правое значения как постоянные вне диапазона:
>>> from scipy import interp, arange, exp
>>> x = arange(0,10)
>>> y = exp(-x/3.0)
>>> interp([9,10], x, y)
array([ 0.04978707, 0.04978707])
2. Линейная (или другая пользовательская) экстраполяция
Вы можете написать обертку вокруг функции интерполяции, которая заботится о линейной экстраполяции. Например:
from scipy.interpolate import interp1d
from scipy import arange, array, exp
def extrap1d(interpolator):
xs = interpolator.x
ys = interpolator.y
def pointwise(x):
if x < xs[0]:
return ys[0]+(x-xs[0])*(ys[1]-ys[0])/(xs[1]-xs[0])
elif x > xs[-1]:
return ys[-1]+(x-xs[-1])*(ys[-1]-ys[-2])/(xs[-1]-xs[-2])
else:
return interpolator(x)
def ufunclike(xs):
return array(map(pointwise, array(xs)))
return ufunclike
extrap1d
принимает функцию интерполяции и возвращает функцию, которая также может экстраполировать. И вы можете использовать его так:
x = arange(0,10)
y = exp(-x/3.0)
f_i = interp1d(x, y)
f_x = extrap1d(f_i)
print f_x([9,10])
Выход:
[ 0.04978707 0.03009069]