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

问题描述

我在 NumPy 数组 knots 中有一个三次样条的节点序列,我想有效地评估整个三次 BSpline 基,该基由某个点 {{1} 处的节点数组表示}}。我目前正在做的是使用 SciPy x 类构建基础:

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 处的整个 BSpline 基并获得基函数值的 NumPy 数组,则代码显然可以加速。有没有使用 SciPy 或其他 Python 库的方法

解决方法

scipy.interpolate._bspl.evaluate_all_bspl 未记录但已完成