我在NumPy数组knots中有一个三次样条的节点序列,我想有效地计算一个完整的三次BSpline基,它是由某个点的节点数组表示的。我目前所做的是使用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上调用它。
如果我能够以某种方式在BSpline点上有效地计算整个x基,并获得基函数值的NumPy数组,那么代码显然可以被加速。有这样一种使用SciPy的方法吗?还是使用另一个Python库?
发布于 2021-06-01 20:27:59
scipy.interpolate._bspl.evaluate_all_bspl是无文档的,但可以完成
https://stackoverflow.com/questions/67783983
复制相似问题