python玄学建模(4):插值(一维)

官方文档链接:https://docs.scipy.org/doc/scipy-1.3.0/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d

scipy库中可以通过interp1d类来实现一维插值

照例还是官方文档的翻译与解释

类原型:class scipy.interpolate.interp1d(xykind='linear'axis=-1copy=Truebounds_error=Nonefill_value=nanassume_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进行一维插值的基本方法。

 

posted @ 2019-08-15 09:56  xsxsz  阅读(1951)  评论(0编辑  收藏  举报