Python,提取样条系数

问题描述

我使用的是 python3,Scipy

我有一个 3d 点 (x,y,z] 从他们我使用 scipy.interpolate.splprep

制作 s apline
x_points = np.linspace(0,2*np.pi,10)
y_points = np.sin(x_points)
z_points = np.cos(x_points)
path = np.vstack([x_points,y_points,z_points])
tck,u = sc.splprep(path,k=3,s=0)

我想得到样条[i]的系数: 例如最新的花键: sp9 = a9 + b9(x-x4) + c9(x-x4)^2 + d9(x-x4)^3

我知道 tck 是 (t,c,k) 一个包含节点向量、B 样条系数和样条次数元组。 但我不知道如何获得这个样条函数并只绘制它

解决方法

tck 元组中的系数在 b 样条基中。如果要将它们转换为幂基,则可以执行 PPoly.from_spline(tck) 。 但是,必须注意:在碱基之间转换会导致数值错误。

编辑。首先,由于它是 splprep,您需要将数组列表 c 转换为适当的 numpy 数组并转置(这是 splPrep 的已知问题)。然后,事实证明,PPoly.from_spline 不处理多维 c(这可能是对 scipy 存储库的一个不错的拉取请求),因此您需要例如遍历维度。类似于(从您的 OP 继续)

t,c,k = tck
cc = np.asarray(c)    # cc.shape is (3,10) now
spl0 = sc.PPoly.from_spline((t,cc.T[0],k))
print(spl0.c)   # here are your coefficients for the component 0
,

我尝试使用这种方法:

import numpy as np
import scipy.interpolate as sc

x_points = np.linspace(0,2*np.pi,10)
y_points = np.sin(x_points)
z_points = np.cos(x_points)
path = np.vstack([x_points,y_points,z_points])
tck,u = sc.splprep(path,k=3,s=0)

p = sc.PPoly.from_spline(tck)

但我在最后一行收到此错误:

p = sc.PPoly.from_spline(tck) 文件 "C:\Users...\Python38\lib\site-packages\scipy\interpolate\interpolate.py",第 1314 行,在 from_spline cvals = np.empty((k + 1,len(t)-1),dtype=c.dtype) AttributeError: 'list' 对象没有属性 'dtype'