You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将计算点间距离图的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:33:31