统一符号规范,厘清 Python 中 */@/dot/matmul 的行为差异,避免乘法运算的隐性 bug。
维度定义
| 概念 | 维度 | 符号 | 示例 shape |
|---|
| 标量 | 0维 | $x$ | 无 |
| 向量 | 1维 | $\boldsymbol{a}$ | $(n,)$ |
| 矩阵 | 2维 | $\boldsymbol{A}$ | $(m, n)$ |
| 张量 | n维 | $\mathcal{X}$ | $(d_1, …, d_n)$ |
统一符号约定
| 运算 | 符号 | 禁止混用 |
|---|
| 哈达玛积 | $\odot$ | $\times$/$*$/$\cdot$ |
| 点积/内积 | $\cdot$ | $\times$/$\odot$ |
| 叉积 | $\times$ | $\cdot$/$\otimes$ |
| 矩阵乘 | 无符号或 $\cdot$ | $\times$/$\odot$ |
| 张量积 | $\otimes$ | $\times$/$\cdot$ |
向量运算
| 运算 | 数学定义 | Python | 输出 |
|---|
| 哈达玛积 | $\boldsymbol{a} \odot \boldsymbol{b}$ | a * b | 向量 |
| 点积 | $\boldsymbol{a} \cdot \boldsymbol{b} = \sum a_i b_i$ | a @ b | 标量 |
| 叉积 | $\boldsymbol{a} \times \boldsymbol{b}$(仅3D) | np.cross(a, b) | 3D向量 |
| 外积 | $\boldsymbol{a} \otimes \boldsymbol{b}$ | np.outer(a, b) | 矩阵 |
矩阵运算
| 运算 | 数学定义 | Python | 维度约束 |
|---|
| 哈达玛积 | $(\boldsymbol{A} \odot \boldsymbol{B}){ij} = A{ij}B_{ij}$ | A * B | shape 相同 |
| 矩阵乘 | $(\boldsymbol{AB}){ij} = \sum_k A{ik}B_{kj}$ | A @ B | 前列=后行 |
| 克罗内克积 | $\boldsymbol{A} \otimes \boldsymbol{B}$ | np.kron(A, B) | 无约束 |
高维张量
批量矩阵乘法
$X \in \mathbb{R}^{B \times m \times n}$,$Y \in \mathbb{R}^{B \times n \times p}$:
1
| 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 |
记忆口诀
- 符号:$\odot$ 元素乘,$\cdot$ 点积缩并,$\times$ 3D 叉积,$\otimes$ 张量升维
- Python:
* 永远元素乘,@ 才是正经数学乘 - 维度:哈达玛积维度不变,点积矩阵乘缩并降维,叉积仅限 3D,张量积必升维
Comments