首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从BSpline中提取scipy.interpolate.BSpline基

如何从BSpline中提取scipy.interpolate.BSpline基
EN

Stack Overflow用户
提问于 2017-08-28 22:05:07
回答 1查看 3K关注 0票数 6

this question中,我询问社区scipy.interpolate.splev是如何计算样条基的。我的目标是通过预先计算一个splev来比bspline basis更快地计算一个样条,并通过做一个basiscontrol point点积生成一条曲线。

从那时起, interpolator被添加到scipy中。 function,我认为它可以用来返回用于计算样条的基。

因此,例如,使用代码from here和下面的输入:

代码语言:javascript
复制
import numpy as np

# Control points
cv = np.array([[ 50.,  25., 0.],
       [ 59.,  12., 0.],
       [ 50.,  10., 0.],
       [ 57.,   2., 0.],
       [ 40.,   4., 0.],
       [ 40.,   14., 0.]])

kv = [0, 0, 0, 0, 1, 2, 3, 3, 3, 3] # knot vector
n = 10  # 10 samples (keeping it simple)
degree = 3 # Curve degree

我可以计算以下B样条基:

代码语言:javascript
复制
[[ 1.          0.          0.          0.          0.          0.        ]
 [ 0.2962963   0.56481481  0.13271605  0.00617284  0.          0.        ]
 [ 0.03703704  0.51851852  0.39506173  0.04938272  0.          0.        ]
 [ 0.          0.25        0.58333333  0.16666667  0.          0.        ]
 [ 0.          0.07407407  0.54938272  0.36728395  0.00925926  0.        ]
 [ 0.          0.00925926  0.36728395  0.54938272  0.07407407  0.        ]
 [ 0.          0.          0.16666667  0.58333333  0.25        0.        ]
 [ 0.          0.          0.04938272  0.39506173  0.51851852  0.03703704]
 [ 0.          0.          0.00617284  0.13271605  0.56481481  0.2962963 ]
 [ 0.          0.          0.          0.          0.          1.        ]]

使用np.dotbasiscontrol points一起返回曲线上的10个示例:

代码语言:javascript
复制
[[ 50.          25.           0.        ]
 [ 55.12654321  15.52469136   0.        ]
 [ 55.01234568  11.19753086   0.        ]
 [ 53.41666667   9.16666667   0.        ]
 [ 53.14506173   7.15432099   0.        ]
 [ 53.1882716    5.17901235   0.        ]
 [ 51.58333333   3.83333333   0.        ]
 [ 47.20987654   3.87654321   0.        ]
 [ 42.31790123   6.7345679    0.        ]
 [ 40.          14.           0.        ]]

问题:是否可以从scipy.interpolate.BSpline中提取上面描述的基础?

显然,我一定是用错了,因为当我尝试的时候,我得到了这样的东西:

代码语言:javascript
复制
from scipy.interpolate import BSpline
b = BSpline.basis_element(kv)
print b(np.linspace(kv[0],kv[-1],n)) # i'm not sure what these values represent
[ 0.          0.00256299  0.04495618  0.16555213  0.28691315  0.28691315
  0.16555213  0.04495618  0.00256299  0.        ]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-28 23:02:43

BSpline.basis_element把内部结作为它的论点。

在您的例子中,您填充了结,但这并没有达到您所认为的那样:

代码语言:javascript
复制
In [3]: t = [0, 0, 0, 0, 1, 2, 3, 3, 3, 3]

In [4]: b = BSpline.basis_element(t)

In [5]: b.k
Out[5]: 8

所以这是一个8阶样条。

如果你想要二次样条,你可以

代码语言:javascript
复制
In [7]: b1 = BSpline.basis_element([0, 1, 2, 3])

In [8]: b1.k
Out[8]: 2

In [9]: b1.t
Out[9]: array([-1., -1.,  0.,  1.,  2.,  3.,  4.,  4.])

迷惑了?这个方法很简单:bsplines.py#L243-L302

BSpline.basis_element返回的可调用函数实际上是b样条函数。然后,使用数组参数调用它的结果相当于在循环中的BSpline文档字符串中为数组的每个元素https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.BSpline.html直接运行示例代码。

编辑:如果您想要在给定的点上计算所有非零样条的Cox-de Boor算法的一个变体,那么您可以查看一个_bspl.evaluate_all_bsplines函数bspl.pyx#L161 (它本身只是一个C例程的包装器,可以完成所有的繁重工作;请注意,从性能上来说,很难击败后一个函数)。

然而,它不是一个公共功能,因此它不能保证在未来的版本中可用。如果您对它有很好的使用,并且有一个面向用户的API的建议,请将讨论提交到discussion跟踪器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45927965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档