统一符号规范,厘清 Python 中 */@/dot/matmul 的行为差异,避免乘法运算的隐性 bug。
维度定义
| 概念 | 维度 | 符号 | 示例 shape |
|---|
| 标量 | 0维 | x | 无 |
| 向量 | 1维 | a | (n,) |
| 矩阵 | 2维 | A | (m,n) |
| 张量 | n维 | X | (d1,...,dn) |
统一符号约定
| 运算 | 符号 | 禁止混用 |
|---|
| 哈达玛积 | ⊙ | × / ∗ / ⋅ |
| 点积/内积 | ⋅ | × / ⊙ |
| 叉积 | × | ⋅ / ⊗ |
| 矩阵乘 | 无符号或 ⋅ | × / ⊙ |
| 张量积 | ⊗ | × / ⋅ |
向量运算
| 运算 | 数学定义 | Python | 输出 |
|---|
| 哈达玛积 | a⊙b | a * b | 向量 |
| 点积 | a⋅b=∑aibi | a @ b | 标量 |
| 叉积 | a×b (仅3D) | np.cross(a, b) | 3D向量 |
| 外积 | a⊗b | np.outer(a, b) | 矩阵 |
矩阵运算
| 运算 | 数学定义 | Python | 维度约束 |
|---|
| 哈达玛积 | (A⊙B)ij=AijBij | A * B | shape 相同 |
| 矩阵乘 | (AB)ij=∑kAikBkj | A @ B | 前列=后行 |
| 克罗内克积 | A⊗B | np.kron(A, B) | 无约束 |
高维张量
批量矩阵乘法
X∈RB×m×n , Y∈RB×n×p :
Z = X @ Y # shape: (B, m, p)
einsum 万能工具
| 运算 | einsum |
|---|
| 点积 | 'i,i->', a, b |
| 矩阵乘 | 'ij,jk->ik', A, B |
| 批量矩阵乘 | 'bij,bjk->bik', X, Y |
| 转置 | 'ij->ji', A |
高频踩坑
| 坑点 | 避坑铁律 |
|---|
* 当矩阵乘 | * 永远是哈达玛积,矩阵乘用 @ |
np.dot 与 @ 混淆 | 生产环境一律用 @/matmul |
| 一维数组广播 | 显式定义为 (n,1) 或 (1,n) |
| 外积术语混用 | 叉积用 cross,张量积用 outer/kron |
记忆口诀
- 符号: ⊙ 元素乘, ⋅ 点积缩并, × 3D 叉积, ⊗ 张量升维
- Python:
* 永远元素乘,@ 才是正经数学乘
- 维度:哈达玛积维度不变,点积矩阵乘缩并降维,叉积仅限 3D,张量积必升维