能否将计算点间距离图的for循环转换为numpy运算?
用Numpy向量化优化点对距离图计算
你的这段嵌套循环代码在数据量较大时确实开销很高,完全可以用Numpy的向量化运算替代,大幅提升计算效率。以下是优化后的实现:
import numpy as np def distanceMap_vectorized(x, y): numFrame = x.shape[0] numJoint = x.shape[-1] # 扩展维度,为广播计算所有点对做准备 x_expanded = x[:, :, np.newaxis] y_expanded = y[:, :, np.newaxis] # 一次性计算所有帧中所有点对的x、y差值 dx = x_expanded - x_expanded.transpose(0, 2, 1) dy = y_expanded - y_expanded.transpose(0, 2, 1) # 计算所有点对的欧氏距离 dist_matrix = np.sqrt(dx**2 + dy**2) # 提取所有n2 < n1的点对距离(对应原代码的循环逻辑) lower_tri_indices = np.tril_indices(numJoint, k=-1) dMap = dist_matrix[:, lower_tri_indices[0], lower_tri_indices[1]] # 和原代码一致的归一化操作,避免除以0 dMap = dMap / np.max(dMap + 1e-9) return dMap
关键优化点说明:
- 广播机制替代循环:通过扩展维度和转置,一次性完成所有帧、所有点对的差值计算,避免Python层面的嵌套循环(Numpy底层用C实现运算,速度远快于Python循环)
- 精准提取目标点对:用
np.tril_indices(numJoint, k=-1)直接获取所有下三角(不包含对角线)的索引,完美对应原代码中n2 < n1的点对逻辑 - 输出维度完全匹配:对于输入维度为
[8,11]的x和y,输出维度依然是(8,55),和原代码结果一致
验证示例:
假设x[0] = [1,2,3,...,11],忽略y的情况下,优化后的代码计算出的dMap[0]和原代码的结果完全一致,只是通过向量化方式一次性完成计算。
内容的提问来源于stack exchange,提问作者MooNChilD Song
相关产品推荐
相关产品推荐

