在Python中高效地评估整个BSpline基础

在Python中高效地评估整个BSpline基础,python,numpy,scipy,Python,Numpy,Scipy,我在NumPy数组中有一个三次样条曲线的节点序列节点,我想有效地计算一个完整的三次BSpline基,它由某个点的节点数组x表示。我目前正在使用SciPySciPy.interpolate.BSpline类构建基础: from scipy.interpolate import BSpline def bspline_basis(knots): return [ BSpline.basis_element(knots[i:(i+5)], extrapolate=False)

我在NumPy数组中有一个三次样条曲线的节点序列
节点
,我想有效地计算一个完整的三次BSpline基,它由某个点的节点数组
x
表示。我目前正在使用SciPy
SciPy.interpolate.BSpline
类构建基础:

from scipy.interpolate import BSpline

def bspline_basis(knots):
    return [
        BSpline.basis_element(knots[i:(i+5)], extrapolate=False)
        for i in range(len(knots) - 4)
    ]
然后使用返回的评估依据:

def eval_basis(basis, x):
    return [elem(val).item() for elem in basis]
但是,由于
eval_basis
函数被重复调用了数百万次,因此上面的代码很慢!
BSpline
对象针对数组操作进行了优化,我向它提供了单个标量
x
,并从结果数组中提取标量

由于我在现有的代码库中操作,无法将调用协议更改为
eval_basis
,因此必须在单个标量
x
上调用它


如果我能够以某种方式有效地在点
x
处计算整个BSpline基并获得基函数值的NumPy数组,那么代码显然可以加速。有没有这样一种使用SciPy或其他Python库的方法?

SciPy.interpolate.\u bspl.evaluate\u all\u bspl没有文档记录,但可以完成它

因为它没有文档记录,也许可以在您的答案中添加一些上下文和代码来展示如何使用它?我不知道它存在于哪个版本中,但在官方的scipy存储库中,它似乎并不存在:事实上,它是
\u bspl.evaluate\u all\u bspl
。它可能会在某一点上增加一个公共接口,但今天您可以使用非公共的内部版本(caveat-emptor)太棒了!真管用!