张芷铭的个人博客

统一符号规范,厘清 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 * Bshape 相同
矩阵乘$(\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