官方文档链接:https://docs.scipy.org/doc/scipy-1.3.0/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d
scipy库中可以通过interp1d类来实现一维插值
照例还是官方文档的翻译与解释
类原型:class scipy.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;
(其实只要清楚插值算法的大致流程,这些参数都很好理解)
官网的代码示例如下
>>> import matplotlib.pyplot as plt >>> from scipy import interpolate >>> 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是多维的情况,文档中没有给出示例,下面是我写的一个简单例子:
import numpy as np import matplotlib.pyplot as plt from scipy import interpolate 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进行一维插值的基本方法。