NumPy 线代工作流:把概念变成代码
本文基于模型知识整理(生成时未联网核对),API 细节以 NumPy/SciPy 官方文档为准。
一句话定义
NumPy 把本库的概念一一映射成 API:@ 乘法(kp-007)、np.linalg.solve/inv/qr/svd/eig/cholesky 各对号一种分解、pinv/cond/norm 对号伪逆/条件数/范数——学习循环是"手算小例子 → 代码验证 → 读数值症状",工具纪律与概念理解互相喂养。
为什么重要
概念不清的人写代码只会"调包猜参数";概念清楚的人能用 NumPy 验证每一条定理(对角化、谱定理、投影),并在报错时读出数学诊断(LinAlgError: Singular matrix = 降秩警报)。本条把前 28 讲变成可运行的肌肉记忆。
前置知识
kp-007(乘法);Python 基础。
核心概念(API ↔ 概念对照)
import numpy as np
A = np.array([[4., 1.], [1., 3.]])
x = np.array([1., 2.])
A @ x # 矩阵-向量乘 (kp-006/007),别用 * (那是逐元素)
A.T # 转置
np.linalg.solve(A, b) # 解 Ax=b —— 首选 (LU, kp-032),勿用 inv(A)@b
np.linalg.inv(A) # 显式逆 —— 教学演示可,工程慎用 (kp-010/023)
np.linalg.det(A) # 行列式 (kp-011)
np.linalg.eig(A) # 特征分解 (方阵, kp-012) —— 非对称时可能复数
np.linalg.eigh(A) # 对称/厄米特专用 —— 保实谱、更快更稳 (kp-015)
np.linalg.qr(A) # QR 分解 (kp-014)
U, S, Vt = np.linalg.svd(A) # SVD,S 为奇异值向量 (kp-018)
np.linalg.pinv(A) # 伪逆 (kp-020)
np.linalg.cond(A) # 条件数 (kp-023)
np.linalg.norm(x, ord=2) # 范数;ord=1, np.inf, 'fro' (kp-005)
np.linalg.cholesky(A) # PD 专用平方根分解 (kp-016)
原理与机制
纪律一:solve 而非 inv。np.linalg.solve(A, b) 走 LAPACK 的 LU 分解,更准更快;inv(A) @ b 多算整个逆且误差放大(kp-023 的平方税在真实数据上可复现)——一行之差是新手与熟手的第一分水岭。
纪律二:对称矩阵用 eigh 而非 eig。eigh 利用对称结构(kp-028 结构即算法)保证实谱且更快;eig 不利用结构,对称阵也可能返回 -0.0 级的噪声虚部。
纪律三:SVD 是万能后门。秩(数非零奇异值)、条件数(σ₁/σₙ)、最小二乘解、伪逆、PCA(kp-021)——概念不清时 SVD 至少给你正确答案;概念清楚时 SVD 给你全部答案。
学习循环建议:每讲一个定理立刻用随机矩阵验证(如"验证 QΛQᵀ=A"三行代码)——定理从背诵变成可复现事实;再故意制造病态矩阵(列几乎共线)观察 cond 与解的漂移(kp-023 的体感训练)。
实例或案例
验证谱定理(三行代码):w, Q = np.linalg.eigh(A) → np.allclose(Q @ np.diag(w) @ Q.T, A) → True——对称矩阵的正交对角化从背诵变成可复现事实(kp-015)。
亲历病态(kp-023 的体感训练):构造列几乎共线的 X(如第二列 = 第一列乘 1.0000001 加微扰),比较 solve 与最小二乘的解随 y 微扰的漂移量——κ 从 10³ 拉到 10⁹,解从稳定变为乱跳,"条件数不是教科书恐吓"从此有实证。
SVD 一站式体检:对任意数据矩阵跑 U,S,Vt = np.linalg.svd(X)——数非零奇异值得秩(kp-003)、σ₁/σₙ 得条件数(kp-023)、按能量截断得 PCA(kp-021):一个 API 串起半门课。
常见误区
- 误区一:
*当矩阵乘。NumPy 的*是逐元素(Hadamard);矩阵乘是@或np.dot——最经典的静默 bug。 - 误区二:整数数组做线代。
np.array([[1,2],[3,4]])是 int 型,求逆/分解会报错或降精度——建阵习惯带点号4.。 - 误区三:一维数组的转置是自身。形状 (n,) 的向量没有行/列之分(
x.T还是它自己);需要列向量请用reshape(-1, 1)—— Broadcasting 惊吓的头号来源。
与其他知识点的关系
自测题
- 用 NumPy 验证对称矩阵谱定理(写三行)。
答:w, Q = np.linalg.eigh(A);print(np.allclose(Q @ np.diag(w) @ Q.T, A)) → True。
- 为什么
np.linalg.eig对对称矩阵可能出现微小虚部?
答:eig 不利用对称结构、走通用 QR 路线;浮点噪声让本应实的特征值带上 1e-16 级虚部——eigh 从结构上排除。
solve(A, b)抛 LinAlgError: Singular matrix 说明什么、下一步?
答:检测到精确奇异(零主元);数学上应查秩/列相关性,数值上考虑最小二乘/伪溢/正则化(kp-019/020/030)。
延伸阅读
- NumPy
numpy.linalg官方文档(每个函数的"Notes"都注明底层 LAPACK 例程)。 - SciPy
scipy.linalg(更全的分解族与稀疏版)。 - Kaggle Learn 的 Linear Algebra 课(交互式练习)。