问题描述
我在 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
未记录但已完成