在本章中,我們將討論插值,及如何在SciPy中使用它。
插值是在直線或曲線上的兩點(diǎn)之間找到值的過程。 為了幫助記住它的含義,我們應(yīng)該將“inter”這個(gè)詞的第一部分想象為“輸入”,表示要查看原來數(shù)據(jù)的“內(nèi)部”。 這種插值工具不僅適用于統(tǒng)計(jì)學(xué),而且在科學(xué),商業(yè)或需要預(yù)測(cè)兩個(gè)現(xiàn)有數(shù)據(jù)點(diǎn)內(nèi)的值時(shí)也很有用。
下面創(chuàng)建一些數(shù)據(jù),看看如何使用scipy.interpolate包進(jìn)行插值。
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
print (x,y)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 0. 0.36363636 0.72727273 1.09090909 1.45454545 1.81818182
2.18181818 2.54545455 2.90909091 3.27272727 3.63636364 4. ] [-0.65364362 -0.61966189 -0.51077021 -0.31047698 -0.00715476 0.37976236
0.76715099 0.99239518 0.85886263 0.27994201 -0.52586509 -0.99582185]
現(xiàn)在,有兩個(gè)數(shù)組。 假設(shè)這兩個(gè)數(shù)組作為空間點(diǎn)的兩個(gè)維度,使用下面的程序進(jìn)行繪圖,并看看它們的樣子。
plt.plot(x, y,’o’)
plt.show()
上述程序?qū)⑸梢韵螺敵?-
scipy.interpolate中的interp1d類是一種創(chuàng)建基于固定數(shù)據(jù)點(diǎn)的函數(shù)的便捷方法,可以使用線性插值在給定數(shù)據(jù)定義的域內(nèi)的任意位置評(píng)估該函數(shù)。
通過使用上述數(shù)據(jù),創(chuàng)建一個(gè)插值函數(shù)并繪制一個(gè)新的插值圖。
f1 = interp1d(x, y,kind = 'linear')
f2 = interp1d(x, y, kind = 'cubic')
使用interp1d函數(shù),創(chuàng)建了兩個(gè)函數(shù)f1和f2。 這些函數(shù)對(duì)于給定的輸入x返回y。 第三種變量類型表示插值技術(shù)的類型。 ‘線性’,’最近’,’零’,’線性’,’二次’,’立方’是一些插值技術(shù)。
現(xiàn)在,創(chuàng)建更多長(zhǎng)度的新輸入以查看插值的明顯區(qū)別。 對(duì)新數(shù)據(jù)使用舊數(shù)據(jù)的相同功能。
xnew = np.linspace(0, 4,30)
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')
plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')
plt.show()
上述程序?qū)⑸梢韵螺敵?-

為了通過數(shù)據(jù)點(diǎn)畫出平滑的曲線,繪圖員曾經(jīng)使用薄的柔性木條,硬橡膠,金屬或塑料稱為機(jī)械樣條。 為了使用機(jī)械花鍵,在設(shè)計(jì)中沿著曲線明確選擇了一些銷釘,然后將花鍵彎曲,以便它們接觸到每個(gè)銷釘。
顯然,在這種結(jié)構(gòu)下,樣條曲線在這些引腳上插入曲線。 它可以用來在其他圖紙中重現(xiàn)曲線。 引腳所在的點(diǎn)稱為結(jié)。 可以通過調(diào)整結(jié)點(diǎn)的位置來改變樣條線所定義的曲線的形狀。
單變量樣條
一維平滑樣條擬合一組給定的數(shù)據(jù)點(diǎn)。 Scipy.interpolate中的UnivariateSpline類是創(chuàng)建基于固定數(shù)據(jù)點(diǎn)類的函數(shù)的便捷方法 - scipy.interpolate.UnivariateSpline(x,y,w = None,bbox = [None,None],k = 3,s = None,ext = 0,check_finite = False)。
下面來看看一個(gè)例子。
import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
x = np.linspace(-3, 3, 50)
y = np.exp(-x**2) + 0.1 * np.random.randn(50)
plt.plot(x, y, 'ro', ms = 5)
plt.show()
使用平滑參數(shù)的默認(rèn)值。效果如下 -
spl = UnivariateSpline(x, y)
xs = np.linspace(-3, 3, 1000)
plt.plot(xs, spl(xs), 'g', lw = 3)
plt.show()
手動(dòng)更改平滑量。效果如下 -
spl.set_smoothing_factor(0.5)
plt.plot(xs, spl(xs), 'b', lw = 3)
plt.show()
效果如下 -