使用numpy dot实现矩阵向量乘法的形状匹配问题
二者可以完成乘法的核心原因
你产生这个疑问的本质是把NumPy里的一维数组和二维的行/列向量概念搞混了,同时对NumPy实现的张量乘法维度匹配规则有误解:
- 首先明确形状差异:你定义的
v = np.array([1,2])是一维数组,形状为(2,),它本身没有“行”“列”的方向属性,和形状为(1,2)的二维行向量、形状为(2,1)的二维列向量是完全不同的数组类型。你直觉里认为它是“1行2列”,其实是把一维数组错当成了二维行向量。 - 你提到的“矩阵列数必须与向量行数相等才能相乘”是严格的二维线性代数矩阵乘法规则,NumPy的张量乘法(
@运算符、np.dot接口)对一维数组做了专门的适配:当参与运算的两个操作数里有一维数组时,不会强制要求它满足二维矩阵的行列匹配规则,只会检查一维数组的长度,是否和另一个操作数对应要收缩的维度长度相等。 - 具体到你的例子:矩阵
m = np.array([[3,4], [5,6], [7,5]])是形状(3,2)的二维数组,做m @ v运算时,需要收缩的是m的最后一个维度(长度为2),刚好和v的唯一维度长度(2)一致,维度校验直接通过,自然可以完成运算。计算时会自动把v当成列向量参与运算,最终输出形状为(3,)的一维数组,结果为[11, 17, 17]。
补充验证:如果你把v定义成真正的二维行向量
v = np.array([[1,2]])(形状(1,2)),此时两个操作数都是二维数组,就会严格执行二维矩阵乘法的维度校验,m的最后一维长度2和v的倒数第二维长度1不匹配,运行时会直接抛出维度不匹配的错误。
内容的提问来源于stack exchange,提问作者user16982433
相关产品推荐
相关产品推荐

