如何用Numpy将矩阵与向量相乘生成三维矩阵?
实现MxN矩阵与L维向量的三维元素级扩展乘法
你要实现的是将二维矩阵与一维向量进行广播式元素相乘,最终得到三维矩阵,核心是利用数组的维度扩展和广播机制,下面给出几种高效实现方式(以Python的NumPy为例,这是数值计算的标准工具):
方法1:利用NumPy广播机制(推荐)
NumPy的广播会自动对齐不同维度的数组,只需手动将矩阵扩展一个维度,再与向量相乘即可:
import numpy as np # 示例数据:2x3矩阵A,4维向量b A = np.array([[1, 2, 3], [4, 5, 6]]) b = np.array([10, 20, 30, 40]) # 将A扩展为MxNx1的三维数组,与b自动广播相乘 C = A[:, :, np.newaxis] * b # 等价写法:C = A[..., np.newaxis] * b
A[:, :, np.newaxis]把原(2,3)的A变成(2,3,1),b会被自动广播为(1,1,4),两者逐元素相乘后得到(2,3,4)的三维矩阵,完全满足C[m,n,k] = A[m,n] * b[k]的要求。
方法2:外积+维度重构
先将矩阵展平为一维数组,与向量做外积得到二维矩阵,再重构回三维:
# 展平A后与b做外积,再reshape为目标维度 C = np.outer(A.flatten(), b).reshape(A.shape[0], A.shape[1], len(b))
这种方式逻辑直观,适合理解外积扩展的本质,但效率和广播方法基本一致。
验证结果
可以通过索引取值验证:
print(C[0, 1, 2]) # 输出60,对应A[0,1]*b[2] = 2*30=60 print(C.shape) # 输出(2, 3, 4),符合MxNxL的维度要求
原生Python实现(仅小数据量演示)
如果不用NumPy,也可以用嵌套循环实现,但性能远不如NumPy,仅作参考:
M, N = A.shape L = len(b) C = [] for m in range(M): row = [] for n in range(N): elem = [A[m][n] * b[k] for k in range(L)] row.append(elem) C.append(row) # 转成NumPy数组:C = np.array(C)
内容的提问来源于stack exchange,提问作者Itamar beeri
相关产品推荐
相关产品推荐

