官方文檔鏈接: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進行一維插值的基本方法。