Numpy中计算两个2D数组行之间L2范数的高效实现方法
计算两个Numpy数组行对行L2距离的向量化实现
最优高效实现(低内存占用)
利用L2距离的代数展开公式优化计算,避免生成超大中间数组,适配你当前的数组规模:
import numpy as np # 假设arr1为7000x100的第一个数组,arr2为4000x100的第二个数组 # 计算arr1每行的平方和,形状为 (7000,) arr1_row_sq = np.sum(arr1 ** 2, axis=1) # 计算arr2每行的平方和,保持维度为 (4000, 1) 适配广播规则 arr2_row_sq = np.sum(arr2 ** 2, axis=1, keepdims=True) # 计算行点积,得到4000x7000的矩阵 cross_dot = arr2 @ arr1.T # 代入公式计算L2距离,加maximum避免浮点数精度导致的负数开根号报错 l2_matrix = np.sqrt(np.maximum(arr2_row_sq + arr1_row_sq - 2 * cross_dot, 0))
输出l2_matrix的形状就是你需要的4000x700,l2_matrix[i][j]对应第二个数组第i行和第一个数组第j行的L2距离。
基于numpy.linalg.norm的简洁实现
如果更在意代码简洁度,也可以直接用广播配合norm方法实现,不过内存占用更高:
l2_matrix = np.linalg.norm(arr2[:, np.newaxis] - arr1, axis=-1)
实现逻辑是通过arr2[:, np.newaxis]把arr2扩展为4000x1x100的维度,和7000x100的arr1广播相减得到4000x7000x100的差值矩阵,最后对最后一个维度求L2范数得到结果。
内容的提问来源于stack exchange,提问作者DHH
相关产品推荐
相关产品推荐

