Python 如何从scipy.interpolate.BSpline提取BSpline基

Python 如何从scipy.interpolate.BSpline提取BSpline基,python,numpy,scipy,Python,Numpy,Scipy,在年,我向社区询问了scipy.interpolate.splev如何计算样条曲线基。。我的目标是通过预先计算bspline基来计算样条曲线,比splev更快,并通过对控制点点积进行基生成曲线 从那时起,被添加到scipy,我想它可以用来返回用于计算样条曲线的基 例如,使用以下输入的代码: import numpy as np # Control points cv = np.array([[ 50., 25., 0.], [ 59., 12., 0.], [

在年,我向社区询问了
scipy.interpolate.splev
如何计算样条曲线基。。我的目标是通过预先计算
bspline基
来计算样条曲线,比
splev
更快,并通过对
控制点
点积进行
生成曲线

从那时起,被添加到
scipy
,我想它可以用来返回用于计算样条曲线的基

例如,使用以下输入的代码:

import numpy as np

# Control points
cv = np.array([[ 50.,  25., 0.],
       [ 59.,  12., 0.],
       [ 50.,  10., 0.],
       [ 57.,   2., 0.],
       [ 40.,   4., 0.],
       [ 40.,   14., 0.]])

kv = [0, 0, 0, 0, 1, 2, 3, 3, 3, 3] # knot vector
n = 10  # 10 samples (keeping it simple)
degree = 3 # Curve degree
我可以计算以下bspline基准:

[[ 1.          0.          0.          0.          0.          0.        ]
 [ 0.2962963   0.56481481  0.13271605  0.00617284  0.          0.        ]
 [ 0.03703704  0.51851852  0.39506173  0.04938272  0.          0.        ]
 [ 0.          0.25        0.58333333  0.16666667  0.          0.        ]
 [ 0.          0.07407407  0.54938272  0.36728395  0.00925926  0.        ]
 [ 0.          0.00925926  0.36728395  0.54938272  0.07407407  0.        ]
 [ 0.          0.          0.16666667  0.58333333  0.25        0.        ]
 [ 0.          0.          0.04938272  0.39506173  0.51851852  0.03703704]
 [ 0.          0.          0.00617284  0.13271605  0.56481481  0.2962963 ]
 [ 0.          0.          0.          0.          0.          1.        ]]
np.dot
basis
控制点一起使用
在曲线上返回10个样本:

[[ 50.          25.           0.        ]
 [ 55.12654321  15.52469136   0.        ]
 [ 55.01234568  11.19753086   0.        ]
 [ 53.41666667   9.16666667   0.        ]
 [ 53.14506173   7.15432099   0.        ]
 [ 53.1882716    5.17901235   0.        ]
 [ 51.58333333   3.83333333   0.        ]
 [ 47.20987654   3.87654321   0.        ]
 [ 42.31790123   6.7345679    0.        ]
 [ 40.          14.           0.        ]]
问题:是否可以从
scipy.interpolate.BSpline
中提取上述基础

显然,我一定是用错了,因为当我尝试时,我得到了如下结果:

from scipy.interpolate import BSpline
b = BSpline.basis_element(kv)
print b(np.linspace(kv[0],kv[-1],n)) # i'm not sure what these values represent
[ 0.          0.00256299  0.04495618  0.16555213  0.28691315  0.28691315
  0.16555213  0.04495618  0.00256299  0.        ]

BSpline.basis\u元素
将内部节点作为其参数

在您的示例中,您填充了结,但这并没有达到您认为的效果:

In [3]: t = [0, 0, 0, 0, 1, 2, 3, 3, 3, 3]

In [4]: b = BSpline.basis_element(t)

In [5]: b.k
Out[5]: 8
这是一条8阶样条曲线

如果你想要一条二次样条曲线,你可以这样做

In [7]: b1 = BSpline.basis_element([0, 1, 2, 3])

In [8]: b1.k
Out[8]: 2

In [9]: b1.t
Out[9]: array([-1., -1.,  0.,  1.,  2.,  3.,  4.,  4.])
困惑?方法非常简单:

BSpline.basis\u元素
返回的可调用函数实际上是一个b样条函数。使用数组参数调用它的结果相当于在循环中为数组的每个元素直接运行
BSpline
docstring中的示例代码

编辑:如果您正在寻找计算给定点上所有非零样条曲线的Cox de Boor算法的变体,那么您可以查看一个
\u bspl.evaluate\u all \u bsplines
函数, (它本身只是完成所有繁重工作的C例程的包装器;请注意,在性能方面很难击败后者。)


但是,它不是一个公共功能,因此不能保证在将来的版本中可用。如果您对它有很好的用途,并且对面向用户的API有建议,请将讨论转到scipy bug tracker。

感谢您的澄清。我被术语弄糊涂了。