基于顶点索引数组向量化计算边长度数组
向量化计算边长度的实现方法
核心思路是利用NumPy的索引广播特性,批量提取边的两端顶点坐标,计算坐标差后用np.linalg.norm一次性求出所有边的长度,全程无需循环。
步骤示例
- 准备测试数据
import numpy as np # 3×N的顶点坐标矩阵(N为顶点数,行对应x/y/z轴) vertices = np.array([ [0, 1, 3, 5], # x坐标行 [0, 2, 4, 6], # y坐标行 [0, 3, 5, 7] # z坐标行 ]) # 2×M的边索引数组(M为边数,行对应起点/终点索引) edges = np.array([ [0, 1, 2], # 所有边的起点索引 [1, 2, 3] # 所有边的终点索引 ])
- 批量提取边的两端坐标
通过索引直接取出所有边的起点和终点坐标,得到两个3×M的矩阵:
start_coords = vertices[:, edges[0]] # 起点坐标矩阵(每列对应一条边的起点) end_coords = vertices[:, edges[1]] # 终点坐标矩阵(每列对应一条边的终点)
- 向量化计算边长度
计算坐标差后,指定axis=0对每一列(单条边的向量)求欧氏范数:
# 计算每条边的坐标差向量 vec_diff = end_coords - start_coords # 批量计算所有边的长度 edge_lengths = np.linalg.norm(vec_diff, axis=0)
输出结果
print(edge_lengths) # 输出:[1.73205081 2.82842712 2.82842712]
这种方式完全依赖NumPy的底层向量化运算,比Python循环效率高几个数量级,尤其适合处理大规模的顶点和边数据。
内容的提问来源于stack exchange,提问作者ollie d
相关产品推荐
相关产品推荐

