首页 > 编程问答 >如何从 scipy.interpolate.BSpline 中提取 BSpline 基础

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

时间:2024-07-30 09:58:33浏览次数:7  
标签:python numpy scipy

这个问题 我向社区询问了 scipy.interpolate.splev 如何计算样条线基础。我的目标是通过预先计算a splev 来更快地计算样条线 bspline basis 并通过执行以下操作来生成曲线 basis control point 点积。

从那时起 一个新的 scipy.interpolate.BSpline 插值器 被添加到 scipy 它带有 basis_element 功能 ,我认为它可以用于返回用于计算样条线的基础。

因此,例如使用代码 来自此处 并输入以下输入:

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

我可以计算以下 bspline 基础:| ||使用

[[ 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.dot basis 在曲线上返回10个样本: control points 问题

[[ 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 显然我必须使用错误,因为当我尝试时我得到这样的东西:

Obviously I must be using it wrong, because when I try I get something like this:

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.        ]

你几乎就在那里了,但你需要做一些事情来获得你想要的结果:

  1. 分别计算每个基函数。 BSpline.basis_element 函数创建了一个 单一 基函数,你需要为你的样条曲线计算所有基函数。
  2. 在样条曲线域上评估每个基函数。 BSpline.basis_element(knots)(x) 返回在 x 处计算的单个基函数,你需要在你的所有样本点上对其进行计算以获得完整的基矩阵。

以下是实现方法:

import numpy as np
from scipy.interpolate import BSpline

# 控制点
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] # 节点向量
n = 10  # 10 个样本(保持简单)
degree = 3 # 曲线阶数

# 创建 B 样条基
spline_basis = [BSpline.basis_element(kv[i:i+degree+2]) 
                for i in range(len(kv)-degree-1)]

# 在样本点上评估基函数
x = np.linspace(kv[0], kv[-1], n)
basis_matrix = np.array([basis(x) for basis in spline_basis]).T

print(basis_matrix)

这将打印出你之前计算的相同的基矩阵。然后,你可以使用此基矩阵和控制点来计算样条曲线:

# 计算样条曲线点
spline_points = np.dot(basis_matrix, cv)

print(spline_points)

这将打印出与以前相同的样条曲线点。

简而言之,你需要为你的样条曲线创建每个基函数,在你的样本点上对其进行评估,并将结果排列成矩阵。希望这会有所帮助!

标签:python,numpy,scipy
From: 45927965

相关文章

  • Open3D点云裁剪-用Python实现高效的点云处理技术
    点云数据是计算机视觉领域中常用的一种数据表示形式,它以三维空间中的离散点集合的方式来描述物体的形状和结构,在点云数据处理过程中,点云裁剪是一项关键任务,它可以帮助我们从原始的点云数据中提取出感兴趣的物体或区域,从而提高数据处理效率和准确性,本文将介绍如何使用Open3D库和......
  • Python,计算HSV图像的直方图,忽略背景
    我正在尝试使用openCV计算HSV图像的直方图,使用以下代码:defistogrammaHSV(image,histSize):hsv_planes=cv2.split(image)histSize=histSizehistRange=(0,256)accumulate=Falseh_hist=np.array(cv2.calcHist(hsv_planes,[0],None,[......
  • Pandas 和 Numpy 版本的问题
    我认为有很多冲突。我试图在笔记本中运行一些代码并收到以下消息:ImportError:此版本的pandas与numpy<1.16.5不兼容你的numpy版本是1.16.2。请将numpy升级到>=1.16.5以使用此pandas版本我安装了pandas1.2.2版本。我运行了condaupdaten......
  • python性能分析器:cProfile
    代码:(1)importcProfileimportrecProfile.run('re.compile("foo|bar")')运行结果:(2)importcProfiledefrunRe():importrecProfile.runctx('re.compile("foo|bar")',None,locals())runRe()运行结果:(3)i......
  • 基于Python网络招聘数据可视化分析系统的设计与实现
    基于Python网络招聘数据可视化分析系统的设计与实现DesignandImplementationofPython-basedNetworkRecruitmentDataVisualizationAnalysisSystem完整下载链接:基于Python网络招聘数据可视化分析系统的设计与实现文章目录基于Python网络招聘数据可视化分析系......
  • 即使使用 docker run -dit 命令,python-Docker 容器也会在运行两秒后退出
    我想从此处使用Dockerfile测试自定义kubernetes调度程序:FROMpython:3.7RUNpipinstallkubernetesCOPYscheduler.py/scheduler.pyCMDpython/scheduler.py一旦创建了映像和容器:dockerbuild-tapp.dockercontainerrun-d-it--namemy-sched......
  • Python多重处理,如何避免创建具有百万个对象的元组
    python多处理新手。我有一项任务,涉及访问网络服务数百万次并将响应保存在文件中(每个请求都有单独的文件)。我已经得到了高级工作代码,但对一些事情没有感到困惑。以下两种语法有什么区别?pool=Pool(processes=4)pool.starmap(task,listOfInputParametersTu......
  • Python OpenCV - 显示坏像素检查测试
    我想找到显示器中存在的每个坏像素。坏像素可能是颜色不正确的像素,或者像素只是黑色。显示屏的尺寸为160x320像素。所以如果显示效果好的话,必须有160*320=51200像素。如果显示器没有51200像素,那就是坏的。另外,我想知道每个坏像素的位置。一旦拍摄的图像太大,我将共享一个......
  • 在python日志输出的每一行前面添加变量缩进
    我正在将日志记录构建到一个Python应用程序中,我希望它是人类可读的。目前,调试日志记录了调用的每个函数以及参数和返回值。这意味着,实际上,嵌套函数调用的调试日志可能如下所示:2024-07-2916:52:26,641:DEBUG:MainController.initialize_componentscalledwithargs<control......
  • 使用 DQN 实现 pong,使用 python 中的特征向量而不是像素。我的 DQNA 实现代码正确吗,因
    我正在致力于使用OpenAI的Gym为Pong游戏实现强化学习(RL)环境。目标是训练人工智能代理通过控制球拍来打乒乓球。代理收到太多负面奖励,即使它看起来移动正确。具体来说,奖励函数会惩罚远离球的智能体,但这种情况发生得太频繁,即使球朝球拍移动时似乎也会发生。观察......