0

0

使用 NumPy 向量化计算点到多个参考点的距离

霞舞

霞舞

发布时间:2025-07-12 17:24:01

|

282人浏览过

|

来源于php中文网

原创

使用 numpy 向量化计算点到多个参考点的距离

本文介绍如何使用 NumPy 向量化计算多个点到多个参考点的距离,避免使用循环,提高计算效率。通过巧妙地利用 NumPy 的广播机制,我们可以用简洁的代码实现高效的距离计算,并探讨了大规模数据处理时 scipy.spatial.KDTree 的应用。

在科学计算中,经常需要计算多个点到多个参考点的距离。当参考点数量较多时,使用循环逐个计算距离效率较低。 NumPy 提供了强大的向量化操作,可以避免循环,显著提高计算速度。本文将介绍如何使用 NumPy 的广播机制,实现高效的距离计算。

问题描述

假设我们有一个 N x 3 的数组 points,其中每一行代表一个点的坐标。另外,我们还有一个 M x 3 的数组 references,其中每一行代表一个参考点的坐标。我们的目标是计算 points 中每个点到 references 中所有参考点的距离,得到一个 M x N 的距离矩阵。

解决方案:利用 NumPy 广播机制

NumPy 的广播机制允许对形状不完全相同的数组进行运算。在这种情况下,我们可以利用广播机制,将 points 数组扩展为 M x N x 3 的数组,将 references 数组扩展为 N x M x 3 的数组,然后进行减法运算,最后计算每个点的距离。

以下是实现代码:

import numpy as np

# 设置随机数种子,保证结果可复现
np.random.seed(0)

# 定义点的数量和参考点的数量
N = 4
M = 2

# 生成随机点和参考点
points = np.random.random((N, 3))
references = np.random.random((M, 3))

# 使用 NumPy 向量化计算距离
distances = np.linalg.norm(references - points[:, None], axis=-1)

# 打印结果
print(distances)

代码解释:

  1. points[:, None]:这部分代码是关键。None 在 NumPy 中等价于 np.newaxis,它的作用是在 points 数组的第二个维度(索引为 1 的维度)插入一个新轴。这样,points 数组的形状就从 (N, 3) 变成了 (N, 1, 3)。

  2. references - points[:, None]:由于 points[:, None] 的形状是 (N, 1, 3),而 references 的形状是 (M, 3),NumPy 会自动进行广播。广播的规则是:

    • 比较两个数组的形状,从尾部开始比较。
    • 如果两个维度的大小相等,或者其中一个维度的大小为 1,则这两个数组是兼容的。
    • 如果两个数组的所有维度都兼容,则可以进行广播。
    • 广播后的数组的形状是两个数组形状的各个维度大小的最大值。

    在本例中,references 的形状是 (M, 3),points[:, None] 的形状是 (N, 1, 3)。从尾部开始比较,最后一个维度都是 3,兼容。倒数第二个维度,references 是 M,points[:, None] 是 1,兼容。因此,可以进行广播。广播后,points[:, None] 的形状变为 (N, M, 3),references 的形状变为 (M, N, 3)。然后进行减法运算,得到一个形状为 (M, N, 3) 的数组。

    AOXO_CMS建站系统企业通用版1.0
    AOXO_CMS建站系统企业通用版1.0

    一个功能强大、性能卓越的企业建站系统。使用静态网页技术大大减轻了服务器负担、加快网页的显示速度、提高搜索引擎推广效果。本系统的特点自定义模块多样化、速度快、占用服务器资源小、扩展性强,能方便快捷地建立您的企业展示平台。简便高效的管理操作从用户使用的角度考虑,对功能的操作方便性进行了设计改造。使用户管理的工作量减小。网站互动数据可导出Word文档,邮件同步发送功能可将互动信息推送到指定邮箱,加快企业

    下载
  3. np.linalg.norm(..., axis=-1):np.linalg.norm 函数用于计算向量的范数(长度)。axis=-1 表示沿着最后一个维度(即 3)计算范数。因此,np.linalg.norm(references - points[:, None], axis=-1) 的结果是一个形状为 (M, N) 的数组,其中每个元素表示 points 中对应点到 references 中对应参考点的距离。

输出结果:

[[0.57216693 0.86543108]
 [0.76350759 0.63809564]
 [0.90274337 0.94847268]
 [0.51150232 0.88049546]]

这个结果是一个 M x N 的数组,其中 distances[i, j] 表示 points[j] 到 references[i] 的距离。

注意事项

  • 理解 NumPy 的广播机制是关键。通过插入新轴,可以巧妙地利用广播机制,避免循环,提高计算效率。
  • 上述代码适用于点和参考点的维度相同的情况。如果维度不同,需要进行适当的调整。

大规模数据处理:scipy.spatial.KDTree

如果需要处理大量的点,并且只需要找到距离最近的若干个邻居,那么使用 scipy.spatial.KDTree 会更加高效。 KDTree 是一种空间索引数据结构,可以快速查找给定点附近的点。

以下是使用 scipy.spatial.KDTree 的示例代码:

from scipy.spatial import KDTree

# 创建 KDTree 对象
tree = KDTree(references)

# 查询每个点最近的 K 个邻居
k = 1  # 例如,查找最近的 1 个邻居
distances, indices = tree.query(points, k=k)

# 打印结果
print("Distances:", distances)
print("Indices:", indices)

代码解释:

  1. KDTree(references):使用参考点创建 KDTree 对象。
  2. tree.query(points, k=k):查询 points 中每个点最近的 k 个邻居。返回两个数组:distances 包含距离,indices 包含邻居的索引。

scipy.spatial.KDTree 在大规模数据处理时,效率远高于直接计算所有距离。

总结

本文介绍了如何使用 NumPy 向量化计算多个点到多个参考点的距离,避免使用循环,提高计算效率。通过巧妙地利用 NumPy 的广播机制,我们可以用简洁的代码实现高效的距离计算。对于大规模数据处理,scipy.spatial.KDTree 提供了更高效的解决方案。掌握这些技巧,可以有效地提高科学计算的效率。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

7

2025.12.22

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

61

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

198

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号