本系列是《NumPy 速通》的配套章节。

线性代数是 NumPy 的"根"——NumPy 本来就是为科学计算而生的。矩阵乘法、求逆、解方程组、特征值,在机器学习、图像处理、物理模拟中无处不在。

本章只讲 np.linalg 里最常用的函数,你不需要是数学专家,理解"做什么、什么时候用"就够了。

矩阵乘法:@ vs *(先复习这一课)

最重要的一课:* 是逐元素乘法,@ 才是矩阵乘法(点积)。

import numpy as np

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])

A * B   # 逐元素乘法
# [[ 5 12]
#  [21 32]]

A @ B   # 矩阵乘法(行 × 列)
# [[19 22]
#  [43 50]]

np.dot(A, B)   # 和 @ 等价

⚠️ 灵魂警告(再次强调):用错符号结果完全不同。

  • @ 要求内维相等:(m,n) @ (n,k) → (m,k)
  • 一维向量 @:np.dot([1,2,3], [4,5,6]) → 标量 32(内积)
  • 神经网络前向传播 W @ x、线性回归 X @ theta 都用 @

常用线性代数函数总览

np.linalg.inv(A)        # 逆矩阵(A @ inv(A) = I)
np.linalg.det(A)        # 行列式(判断是否可逆、体积缩放)
np.linalg.eig(A)        # 特征值 & 特征向量
np.linalg.solve(A, b)   # 解线性方程组 A x = b(推荐)
np.linalg.norm(v)       # 向量的模长
np.linalg.matrix_rank(A)# 矩阵的秩
np.linalg.qr(A)         # QR 分解
np.linalg.svd(A)        # 奇异值分解(SVD,压缩/降维核心)

解方程组:np.linalg.solve

# 2x + 3y = 8
#  x +  y = 3
A = np.array([[2, 3],
              [1, 1]])
b = np.array([8, 3])

x = np.linalg.solve(A, b)   # [1. 2.]  即 x=1, y=2

为什么用 solve 而不是 inv(A) @ b?

# 不推荐:先求逆再乘(慢、数值不稳定)
x = np.linalg.inv(A) @ b

# 推荐:直接求解(快、稳定)
x = np.linalg.solve(A, b)

💡 solve 内部用高斯消去等数值稳定的算法,不显式求逆,精度和速度都更好。解线性方程组一律用 solve。

验证解是否正确:

np.allclose(A @ x, b)   # True  代回去检查

逆矩阵与验证

A_inv = np.linalg.inv(A)

I = A @ A_inv            # 应该约等于单位矩阵
np.round(I)              # [[1. 0.] [0. 1.]]

np.allclose(A @ A_inv, np.eye(2))   # True  更严谨的检查

⚠️ 灵魂警告:不是所有矩阵都可逆!行列式为 0(奇异矩阵)时 inv 报错:

np.linalg.inv(np.array([[1, 2], [2, 4]]))   # ❌ LinAlgError: Singular matrix

求逆前先 np.linalg.det(A) 检查(非零才可逆),或用 solve 代替(更稳)。

行列式 det

np.linalg.det(A)    # -2.0000000000000004(浮点误差,接近 -2)
  • det ≠ 0 → 矩阵可逆、方程组有唯一解
  • 几何意义:矩阵把"单位面积"缩放多少倍

特征值:np.linalg.eig

vals, vecs = np.linalg.eig(A)

vals   # array([-0.37228132, 5.37228132])  特征值
vecs   # 每列是对应的特征向量
  • eig 返回 (特征值数组, 特征向量矩阵),每列一个特征向量
  • 验证:A @ v = λ v(特征向量乘 A 等于缩放 λ 倍)

特征值有什么用?

应用 用途
主成分分析 PCA 降维、去冗余
图像/数据压缩 SVD 分解后保留大奇异值
PageRank 网页排名(特征向量)
动力学/稳定性 系统是否收敛

理解"它分解出一个矩阵的本征结构"即可,具体推导用到时再看。

实战:最小二乘拟合(线性回归)

线性回归 y ≈ X @ theta 的解,用 np.linalg.lstsq 一步到位:

# 数据点:(1,2) (2,3) (3,5) 拟合 y = a + b*x
X = np.array([[1, 1],
              [1, 2],
              [1, 3]])
y = np.array([2, 3, 5])

theta, residuals, rank, s = np.linalg.lstsq(X, y, rcond=None)
# theta ≈ [0.333, 1.5]  → y ≈ 0.333 + 1.5x

这就是"用最小二乘解超定方程组"——机器学习线性回归的数学核心。

小结

函数 作用 场景
A @ B 矩阵乘法 前向传播、变换
np.linalg.solve(A, b) 解方程组 求解,推荐优先
np.linalg.inv(A) 逆矩阵 理论上/验证用
np.linalg.det(A) 行列式 判断可逆性
np.linalg.eig(A) 特征值/向量 PCA、降维
np.linalg.lstsq 最小二乘 线性回归拟合
  1. ⚠️ * 逐元素 vs @ 矩阵乘法
  2. 解方程组用 solve(快且稳定),别 inv @ b
  3. 求逆前查 det,奇异矩阵会崩
  4. 特征值 → PCA/降维;lstsq → 回归拟合

上一篇:第 12 章 随机数

🎉 恭喜!13 章全部学完。 现在你已经掌握了 NumPy 的全部核心知识。回到《NumPy 速通》看一遍主线,然后动手敲代码吧。


上一篇:第 12 章 随机数

🎉 恭喜!13 章全部学完。 现在你已经掌握了 NumPy 的全部核心知识。回到《NumPy 速通》看一遍主线,然后动手敲代码吧。