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
相关产品推荐
相关产品推荐

