相关疑难解决方法(0)

具有numpy/scipy的快速b样条算法

我需要在python中计算3D bspline曲线.我查看了scipy.interpolate.splprep和其他一些scipy模块,但找不到任何能让我满意的东西.所以我在下面写了自己的模块.代码工作正常,但速度很慢(测试函数运行在0.03秒,考虑到我只需要100个带有6个控制顶点的样本,这似乎很多).

有没有办法通过一些scipy模块调用来简化下面的代码,这可能会加快它的速度?如果没有,我可以对我的代码做些什么来改善其性能?

import numpy as np

# cv = np.array of 3d control vertices
# n = number of samples (default: 100)
# d = curve degree (default: cubic)
# closed = is the curve closed (periodic) or open? (default: open)
def bspline(cv, n=100, d=3, closed=False):

    # Create a range of u values
    count = len(cv)
    knots = None
    u = None
    if not closed:
        u = np.arange(0,n,dtype='float')/(n-1) * (count-d)
        knots = np.array([0]*d + range(count-d+1) + [count-d]*d,dtype='int')
    else:
        u …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy bspline

10
推荐指数
1
解决办法
4090
查看次数

非单调数据的三次样条(不是一维函数)

我有一条曲线,如下所示:
在此输入图像描述

该图的 x 坐标和 y 坐标为:
path_x= (4.0, 5.638304088577984, 6.785456961280076, 5.638304088577984, 4.0)
path_y =(0.0, 1.147152872702092, 2.7854569612800755, 4.423761049858059, 3.2766081771559668)

我通过以下方式获得了上面的图片:

x_min =min(path_x)-1
x_max =max(path_x)+1
y_min =min(path_y)-1
y_max =max(path_y)+1

num_pts = len(path_x)

fig = plt.figure(figsize=(8,8))
#fig = plt.figure()
plt.suptitle("Curve and the boundary")
ax = fig.add_subplot(1,1,1)

ax.set_xlim([min(x_min,y_min),max(x_max,y_max)])
ax.set_ylim([min(x_min,y_min),max(x_max,y_max)])
ax.plot(path_x,path_y)
Run Code Online (Sandbox Code Playgroud)

现在我的目的是使用三次样条绘制一条平滑的曲线。但看起来对于三次样条,您需要x coordinates按升序排列。而在本例中, 和x values都不y values按升序排列。
这也不是一个函数。也就是说,x value映射了范围内的多个元素。

我也浏览了这篇文章。但我找不到解决我的问题的正确方法。

我非常感谢你在这方面的帮助

python interpolation

3
推荐指数
1
解决办法
1380
查看次数

标签 统计

python ×2

bspline ×1

interpolation ×1

numpy ×1

scipy ×1