我正在尝试移植一个程序,它使用一个手动滚动的插值程序(由一个数学家学院开发)来使用scipy提供的插值程序。我想使用或包装scipy插值程序,使其具有尽可能接近旧插值程序的行为。
这两个函数之间的一个关键区别是,在我们的原始插值-如果输入值高于或低于输入范围,我们的原始插值将外推结果。如果使用scipy插值器尝试此操作,它将引发一个ValueError
。以这个程序为例:
import numpy as np
from scipy import interpolate
x = np.arange(0,10)
y = np.exp(-x/3.0)
f = interpolate.interp1d(x, y)
print f(9)
print f(11) # Causes ValueError, because it's greater than max(x)
有没有一个合理的方法使它不是崩溃,而是最终的线将简单地做一个线性外推,继续由第一个和最后两个点定义的梯度到无穷大。
注意,在真正的软件中,我并没有实际使用exp函数-这里只是为了说明!
一。常数外推
您可以使用scipy中的
interp
函数,它将左右值外推为超出范围的常量:2。线性(或其他自定义)外推
你可以在一个插值函数周围写一个包装器来处理线性外推。例如:
extrap1d
接受一个插值函数并返回一个也可以进行外推的函数。你可以这样使用它:输出:
你可以看看InterpolatedUnivariateSpline
下面是一个使用它的示例:
从SciPy version 0.17.0开始,有一个新的scipy.interpolate.interp1d选项允许外推。只需在调用中设置fill_value=“extrapolate”。通过这种方式修改代码可以:
结果是:
相关问题 更多 >
编程相关推荐