np.array()是唯一推荐的矩阵载体,np.matrix已弃用;矩阵乘法必须用@或np.dot()/np.matmul(),*仅作元素级乘法;需注意维度对齐、广播机制、向量化操作及dtype/shape显式检查。

np.array() 创建的 ndarray 是唯一推荐的矩阵载体,np.matrix 已弃用,强行用会引发兼容性问题和隐式行为陷阱。
矩阵乘法别用 *,用 @ 或 np.dot()
新手最常踩的坑是把 * 当成矩阵乘法:它只做元素级乘法。真正做线性代数意义上的矩阵乘,必须用 @ 运算符或 np.dot()(对二维数组)/ np.matmul()(更严格,不广播一维数组)。
-
A * B→ 对应位置相乘,要求A.shape == B.shape -
A @ B→ 矩阵乘,要求A.shape[1] == B.shape[0],结果形状为(A.shape[0], B.shape[1]) -
np.dot(A, B)在二维时等价于@,但对一维数组会做内积,行为不一致;np.matmul()更可靠 - 批量计算(如 100 个样本 × 特征权重)时,
@自动按最后两维做矩阵乘,无需手动循环
转置别只记 .T,注意 np.newaxis 和维度对齐
.T 是最常用转置方式,但它只交换所有轴顺序,对一维数组无效(shape (n,) 转置后还是 (n,))。真要把它当列向量用,得显式加维度:
-
x = np.array([1, 2, 3])→shape (3,) -
x[:, np.newaxis]或x.reshape(-1, 1)→shape (3, 1),才能参与@运算 - 矩阵乘前务必检查
print(A.shape, B.shape),按规则(m, k) @ (k, n) → (m, n)对齐,错一位就报ValueError: matmul: Input operand 1 has a mismatch in its core dimension
避免 Python 循环,优先用向量化函数
任何带 for 遍历数组元素的操作,都是性能毒药。NumPy 的向量化函数底层调 C/Fortran,快一个数量级以上。
立即学习“Python免费学习笔记(深入)”;
- 求每行均值?用
np.mean(arr, axis=1),不是[np.mean(row) for row in arr] - 条件赋值?用布尔索引:
arr[arr > 0.5] = 1,而非for i in range(...): if ... - 广播机制能自动扩展维度,比如标量 + 数组、(m, 1) + (1, n) → (m, n),但过度广播会吃内存,大数组慎用
np.expand_dims()做中间扩展 - 初始化大数组时,用
np.zeros((m, n), dtype=np.float32)显式指定类型,比默认float64节省一半内存
线性代数运算别硬写,直接调 np.linalg
求逆、解方程、特征分解这些操作,自己实现既慢又不稳定。NumPy 的 np.linalg 模块封装了 LAPACK/BLAS,数值鲁棒且高效。
- 求逆:
np.linalg.inv(A),但实际中尽量避免显式求逆,改用np.linalg.solve(A, b)解Ax = b - 行列式:
np.linalg.det(A),仅适用于小矩阵(>1000×1000 时计算代价高) - 特征值:
eigvals, eigvecs = np.linalg.eig(A),注意返回特征向量是列向量形式 - 奇异值分解:
U, s, Vt = np.linalg.svd(A),比eig()更稳定,适合非方阵
真实项目里最容易被忽略的,是 dtype 和 shape 的隐式转换——比如从 Pandas DataFrame 转 np.array() 默认得到 object 类型,后续所有向量化都失效;又比如拼接数组时没统一 dtype,导致自动升格为 float64 白白占内存。动手前先敲 arr.dtype 和 arr.shape,比猜强十倍。



















