官方文档链接:https://docs.scipy.org/doc/scipy-1.3.0/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d
scipy库中可以通过interp1d类来实现一维插值
照例还是官方文档的翻译与解释
类原型:classscipy.interpolate.interp1d(x, y, kind='linear', axis=-1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)
interp1d的使用非常简单,参数不多但每个都比较重要,就都介绍一下吧
x:一维数组,插值点的x值;
y:一维或多维数组,参与插值的维度的长度要与x一致;
kind:最重要的参数,选择插值方式,包含线性插值、最近邻插值、三次样条插值等常用插值算法,具体可见官方文档;
axis:指定针对y的哪一维进行插值,默认为最后一维;
copy:bool型变量,选择是否复制x与y,默认为True,若为False则会使用x与y的引用;
bounds_error:bool型变量,True时对所有超出x范围的查询均报错,False时则使用fill_value中实现定义的方法,默认为None,当超出查询范围时,除非填充方法是外插(extrapolate),则会报错;
fill_value:对超出x范围的值的填充方法,有以下几种类型:
ndarray或者float:指定固定的填充值;
两元素tuple:分别指定x范围左边和右边的填充值;
'extrapolate':进行外插;
assume_sotred:bool型变量,默认为False,即不假设输入的x是有序的,会自动对x与y进行排序,如果本来就有序可以设置为True;
(其实只要清楚插值算法的大致流程,这些参数都很好理解)
官网的代码示例如下
>>> importmatplotlib.pyplot as plt>>> from scipy importinterpolate>>> x = np.arange(0, 10)>>> y = np.exp(-x/3.0)>>> f =interpolate.interp1d(x, y)>>> xnew = np.arange(0, 9, 0.1)>>> ynew = f(xnew) #use interpolation function returned by `interp1d`
>>> plt.plot(x, y, 'o', xnew, ynew, '-')>>> plt.show()
要注意的一点是interp1d是类而不是函数,其返回值是一个函数,然后通过使用普通python函数的方法来得到插值结果。
对于y是多维的情况,文档中没有给出示例,下面是我写的一个简单例子:
importnumpy as npimportmatplotlib.pyplot as pltfrom scipy importinterpolate
x= np.arange(0,10)
y1= x*x
y2= x*x*x
y=np.stack([y1,y2])
func=interpolate.interp1d(x,y)
xnew= np.arange(0,9,0.1)
ynew=func(xnew)
plt.plot(xnew,ynew.T)#由于interp1d和plot对维度的要求不一致,这里对ynew进行一次转置,否则会报错
可视化结果如图所示:
y有多行的情况就是对多组y值分别进行插值,之间互不影响。
以上就是用scipy进行一维插值的基本方法。