np.dot执行矩阵乘法而非点乘,二维时要求左矩阵列数等于右矩阵行数;逐元素相乘用multiply或*;叉乘仅适用于三维向量,用cross函数。

dot 函数做的是矩阵乘法,不是点乘
很多人被“dot”字面意思误导,以为 np.dot 是“点乘”,其实它在二维数组上执行的是标准的矩阵乘法(即线性代数中的 A × B),要求左矩阵列数等于右矩阵行数。一维数组时才退化为向量点积。
常见错误现象:np.dot(A, B) 报 ValueError: shapes (m,n) and (p,q) not aligned,本质是维度不满足矩阵乘法规则,不是“点乘失败”。
- 若
A形状为(3, 4),B必须是(4, k)才能调用np.dot(A, B) - 若想对两个同形状矩阵逐元素相乘后求和(即真正的点乘意义),应先用
np.multiply再np.sum,或直接用(A * B).sum() -
np.dot对一维数组等价于np.inner,返回标量;对二维则是矩阵乘法;高维会按最后两轴处理,行为更复杂
multiply 函数才是逐元素相乘
np.multiply(或简写 A * B)严格按位置做元素级乘法,要求两数组可广播(broadcastable)。这才是多数人想要的“点乘”——即每个对应位置相乘,不涉及行列索引变换。
使用场景:图像像素缩放、权重掩码应用、特征图逐通道加权。
- 若
A和B都是(3, 4),np.multiply(A, B)输出也是(3, 4) - 支持广播:如
A是(3, 4),B是(4,),则自动沿行方向广播相乘 - 注意:Python 中
*运算符对ndarray默认调用np.multiply,但对np.matrix(已弃用)却调用矩阵乘法,容易混淆
叉乘只适用于三维向量,用 cross 函数
“叉乘”(cross product)在数学中仅定义在 ℝ³ 中的两个向量之间,结果是垂直于二者所在平面的向量。NumPy 不提供矩阵叉乘(不存在这种运算),只提供 np.cross 处理一维向量或批量向量。
常见错误现象:对二维矩阵调用 np.cross(A, B) 却没指定轴,导致结果维度混乱或报错。
-
np.cross(a, b)要求a和b至少有一维长度为 3(默认取最后轴) - 若
a.shape == (N, 3),b.shape == (N, 3),则np.cross(a, b, axis=1)返回(N, 3)的叉积结果 - 不能对任意形状矩阵“叉乘”;试图用
dot或multiply模拟叉乘只会得到完全错误的数值
实际写代码时怎么选
别记名字,看维度和意图。先问自己:我要的结果该是什么形状?
- 要一个标量(比如相似度得分)→ 检查是否向量内积:
np.dot(a, b)或np.sum(a * b) - 要一个同形状数组(比如逐像素增强)→ 用
a * b或np.multiply(a, b) - 要一个新矩阵(比如线性变换:特征 × 权重)→ 用
np.dot(X, W)或更推荐的X @ W(@ 运算符更清晰) - 要三维向量的垂直向量 → 只能用
np.cross(u, v),且确保输入是长度为 3 的向量
最容易被忽略的一点:np.dot 在高维(≥3D)时的行为依赖于轴对齐规则,而 @ 运算符明确只作用于最后两维,可读性和可控性都更好。如果真在处理批量矩阵乘法,优先用 @。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











