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

Python中轴方向矩阵逐行乘积及中位数计算的高效实现

高效实现矩阵行两两相乘后的中位数计算

给定形状为(n, d)的矩阵A(示例为(3,5)),需要完成以下操作:

  • 将所有行两两按元素相乘,得到形状为(n, n, d)的乘积矩阵
  • 对该乘积矩阵沿第三维度(即每个(d,)的向量)计算中位数,最终得到(n, n)的结果矩阵

当前采用双重循环实现,时间复杂度为O(n²),处理大矩阵时效率不足,需要更高效的实现方式。

示例矩阵

import numpy as np
A = np.array([[ 0,  3,  6,  9, 12],
              [ 1,  4,  7, 10, 13],
              [ 2,  5,  8, 11, 14]])

当前低效实现代码

def slow_median_matrix(matrix):
    temp_list = []
    for i in range(matrix.shape[0]):
        row = []
        for j in range(matrix.shape[0]):
            mul = matrix[i, :] * matrix[j, :]
            row.append(np.median(mul))
        temp_list.append(row)
    return np.asarray(temp_list)

高效向量化解决方案

利用NumPy的广播机制消除显式循环,将操作完全向量化,大幅提升效率:

def fast_median_matrix(matrix):
    # 扩展维度实现两两行的元素级相乘,得到(n,n,d)的乘积矩阵
    pairwise_mul = matrix[:, np.newaxis, :] * matrix[np.newaxis, :, :]
    # 沿第三维度计算中位数,得到(n,n)的结果矩阵
    return np.median(pairwise_mul, axis=2)

原理说明

  • matrix[:, np.newaxis, :] 将原矩阵从(n,d)转为(n,1,d),为每行添加一个新维度
  • matrix[np.newaxis, :, :] 将原矩阵从(n,d)转为(1,n,d),为每列添加一个新维度
  • 两者相乘时,NumPy的广播机制会自动扩展维度,生成所有行对的元素乘积,最终得到形状为(n,n,d)的乘积矩阵
  • 最后通过np.median(pairwise_mul, axis=2)直接对每个行对的乘积向量计算中位数,一步得到(n,n)的结果矩阵

验证效果

# 测试示例
A = np.array([[ 0,  3,  6,  9, 12],
              [ 1,  4,  7, 10, 13],
              [ 2,  5,  8, 11, 14]])

print(slow_median_matrix(A))
print(fast_median_matrix(A))
# 两者输出完全一致:
# [[  0.  12.  24.]
#  [ 12.  49.  70.]
#  [ 24.  70. 100.]]

效率优势

这种向量化实现完全依托NumPy底层的C语言优化数组操作,避免了Python解释器层面的循环开销。对于大矩阵(例如n=1000),效率会比双重循环提升几个数量级。

内容的提问来源于stack exchange,提问作者Olivér Palotás

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:55:23