如何用Numpy向量化操作替代循环实现矩阵与向量元素逐次相乘?
用Numpy向量化运算替代for循环实现矩阵与向量元素的批量相乘
你可以利用Numpy的广播机制实现无循环的向量化运算,这比Python层面的for循环效率高得多,尤其适合处理大规模数据场景。
解决方案代码
import numpy as np a = np.ones(9).reshape(3,3) b = np.ones(6390) # 调整向量b的维度,触发广播机制与矩阵a相乘 c = a * b.reshape(-1, 1, 1) print("a = ", a.shape) print("b = ", b.shape) print("c = ", c.shape)
运行结果
a = (3, 3) b = (6390,) c = (6390, 3, 3)
原理说明
Numpy的广播规则会自动扩展维度匹配的数组:
- 将
b从形状(6390,)调整为(6390, 1, 1),reshape(-1,1,1)中的-1表示让Numpy自动计算该维度的长度 - 矩阵
a的形状是(3,3),广播会自动将其扩展为(6390, 3, 3),与调整后的b维度完全匹配 - 此时执行元素级相乘,每个
b[i]会和整个a矩阵的所有元素相乘,最终得到和原for循环完全一致的三维数组
你也可以用np.expand_dims来添加维度,效果完全相同:
b_expanded = np.expand_dims(np.expand_dims(b, axis=1), axis=2) c = a * b_expanded
内容的提问来源于stack exchange,提问作者장민규
相关产品推荐
相关产品推荐

