NumPy 线代工作流:把概念变成代码

06-计算实践与脉络 入门 约 20 分钟 #NumPy#实践#API#工作流 更新 2026-10-02
当前状态:未学
本文基于模型知识整理(生成时未联网核对),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 惊吓的头号来源。

与其他知识点的关系

  • kp-007/010/018/023:本条是它们的执行层。
  • kp-032:各 API 背后的算法谱系(知道 solve 用的 LU、svd 用的分而治之)。

自测题

  1. 用 NumPy 验证对称矩阵谱定理(写三行)。

答:w, Q = np.linalg.eigh(A);print(np.allclose(Q @ np.diag(w) @ Q.T, A)) → True。

  1. 为什么 np.linalg.eig 对对称矩阵可能出现微小虚部?

答:eig 不利用对称结构、走通用 QR 路线;浮点噪声让本应实的特征值带上 1e-16 级虚部——eigh 从结构上排除。

  1. solve(A, b) 抛 LinAlgError: Singular matrix 说明什么、下一步?

答:检测到精确奇异(零主元);数学上应查秩/列相关性,数值上考虑最小二乘/伪溢/正则化(kp-019/020/030)。

延伸阅读

  • NumPy numpy.linalg 官方文档(每个函数的"Notes"都注明底层 LAPACK 例程)。
  • SciPy scipy.linalg(更全的分解族与稀疏版)。
  • Kaggle Learn 的 Linear Algebra 课(交互式练习)。