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(例如由 splprepBSplinec.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