如何用Numpy无循环实现不同形状数组相乘得到目标矩阵?
纯Numpy实现方案
你需要的是利用Numpy的广播机制来实现,无需循环。核心思路是调整数组a的形状,让它和b满足广播条件,从而自动完成逐行的乘法运算。
具体实现步骤:
- 将一维数组
a转换为二维数组(形状为(3, 1)),这样Numpy会自动将其沿第二维度扩展,匹配b的长度。 - 直接让调整后的
a与b相乘,广播机制会帮你完成每行的a[i] * b运算。
代码示例:
import numpy as np # 示例数组 a = np.array([1, 2, 3]) # 长度为3的一维数组 b = np.array([4, 5, 6]) # 长度任意的一维数组 # 转换a的形状并计算 result = a.reshape(3, 1) * b # 或者用np.expand_dims,效果完全相同: # result = np.expand_dims(a, axis=1) * b print(result)
输出结果:
[[ 4 5 6] [ 8 10 12] [12 15 18]]
原理说明:
Numpy广播的核心规则是:
- 当两个数组维度数不同时,维度少的数组会自动在前面补维度,直到维度数一致。
- 对于每个维度,如果其中一个数组的该维度长度为1,就会沿着这个维度复制元素,匹配另一个数组的长度。
这里a.reshape(3,1)的形状是(3,1),b的形状是(3,),广播后:
a会被扩展为(3,3),每行都是[a[0], a[0], a[0]]、[a[1], a[1], a[1]]、[a[2], a[2], a[2]]b会被扩展为(3,3),每列都是[b[0], b[0], b[0]]、[b[1], b[1], b[1]]、[b[2], b[2], b[2]]- 对应元素相乘后,就得到了你需要的每行是
a[i] * b的矩阵。
内容的提问来源于stack exchange,提问作者bilaljo
相关产品推荐
相关产品推荐

