scipy.interpolate.PPoly.
from_spline#
- classmethod PPoly.from_spline(tck, extrapolate=None)[源代码]#
从样条曲线构造分段多项式
- 参数:
- tck
一个样条曲线,由
splrep
或 BSpline 对象返回。- extrapolatebool 或 ‘periodic’,可选
如果为 bool,则确定是否基于第一个和最后一个间隔外推超出范围的点,或者返回 NaN。如果为 ‘periodic’,则使用周期性外推。默认为 True。
示例
构造一个插值样条并将其转换为
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 样条。
如果
tck
对象表示参数样条(例如,由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))
要将此样条转换为幂基,我们将 b 样条系数列表
c
的每个分量转换为相应的立方多项式。>>> polys = [PPoly.from_spline((t, cj, k)) for cj in c] >>> polys[0].c.shape (4, 14)
请注意,多项式 polys 的系数位于幂基中,它们的维度也反映了这一点:这里 4 是阶数(度数 + 1),14 是间隔数,这不过是原始 tck 的节点数组长度减一。
或者,我们可以将这些分量沿着第三维堆叠到单个
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