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進行一維插值的基本方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM