scipy.interpolate.PPoly.
from_spline#
- classmethod PPoly.from_spline(tck, extrapolate=None)[source]#
從 spline 建構一個分段多項式
- 參數:
- tck
一個 spline,由
splrep
或 BSpline 物件所回傳。- extrapolatebool 或 ‘periodic’,選填
如果是 bool,決定是否根據第一個和最後一個區間外插到超出範圍的點,或者返回 NaN。 如果是 ‘periodic’,則使用週期性外插。預設值為 True。
範例
建構一個內插 spline 並將其轉換為
PPoly
實例>>> import numpy as np >>> from scipy.interpolate import splrep, PPoly >>> x = np.linspace(0, 1, 11) >>> y = np.sin(2*np.pi*x) >>> tck = splrep(x, y, s=0) >>> p = PPoly.from_spline(tck) >>> isinstance(p, PPoly) True
請注意,此函數僅支援開箱即用的 1D spline。
如果
tck
物件代表參數式 spline(例如由splprep
或BSpline
且c.ndim > 1
所建構),您將需要手動遍歷維度。>>> from scipy.interpolate import splprep, splev >>> t = np.linspace(0, 1, 11) >>> x = np.sin(2*np.pi*t) >>> y = np.cos(2*np.pi*t) >>> (t, c, k), u = splprep([x, y], s=0)
請注意,
c
是一個長度為 11 的兩個陣列的列表。>>> unew = np.arange(0, 1.01, 0.01) >>> out = splev(unew, (t, c, k))
為了將此 spline 轉換為 power basis,我們將 b-spline 係數列表
c
的每個組件轉換為對應的三次多項式。>>> polys = [PPoly.from_spline((t, cj, k)) for cj in c] >>> polys[0].c.shape (4, 14)
請注意,多項式 polys 的係數在 power basis 中,並且它們的維度正反映了這一點:這裡 4 是階數(次數 + 1),而 14 是區間數—這不過是原始 tck 的 knot 陣列長度減一。
或者,我們可以沿著第三維將組件堆疊成單個
PPoly
>>> cc = np.dstack([p.c for p in polys]) # has shape = (4, 14, 2) >>> poly = PPoly(cc, polys[0].x) >>> np.allclose(poly(unew).T, # note the transpose to match `splev` ... out, atol=1e-15) True