在Python中高效地评估整个BSpline基础
我在NumPy数组中有一个三次样条曲线的节点序列在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)
节点
,我想有效地计算一个完整的三次BSpline基,它由某个点的节点数组x
表示。我目前正在使用SciPySciPy.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)太棒了!真管用!