Python 现代开发学习笔记

(十二)逐元素乘法、点积与矩阵乘法

1. 先手算第一个输出

两个二维数组的星号在相同位置相乘。矩阵乘法使用 @:左边一行与右边一列按位置相乘,再把这些乘积相加。

# 项目文件:demos/matrix.py
# 星号逐格相乘;矩阵乘法把左边一行与右边一列配对相乘再相加。
import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print("逐元素", (a * b).tolist())
print("矩阵乘法", (a @ b).tolist())
v, w = np.array([1, 2]), np.array([5, 7])
print("向量点积", (v @ w).item())
print("按行加权", (a @ w).tolist())
batch = np.stack((a, a * 2))
print("批量矩阵", (batch @ b).shape, (batch @ b).tolist())

对于 [[1,2],[3,4]] @ [[5,6],[7,8]],左上角为 1×5+2×7=19;右上角为 1×6+2×8=22。逐项得到 [[19,22],[43,50]]。星号结果则为 [[5,12],[21,32]]。

左数组 shape 为 (m,k),右数组为 (k,n),同一个 k 对应被配对相乘并求和的轴,结果保留 m 行、n 列。[1,2] @ [5,7] 是两个向量的点积,得到标量 19;矩阵乘向量则给出每行的加权和。

左矩阵每行与右矩阵每列相乘相加,四个输出逐项展开,并与逐元素相乘对照

2. 前面的轴表达批次

batch 的 shape 为 (2,2,2),最后两轴是矩阵,最前一轴表示两份矩阵。与 (2,2) 的 b 做 @ 时,各批次分别做矩阵乘法,得到两份结果,shape 仍为 (2,2,2)。

matmul 对最后两个轴执行矩阵乘法,前面的轴按广播方式配对;先读出矩阵的行列,再看批次怎样对应。矩阵乘法

两批矩阵共享右侧同一矩阵,各自得到独立结果,批次轴不参与行列内积

笔记正文与全部题解 · Ctrl / ⌘ K