Python学习笔记·第20天:NumPy线性代数——矩阵运算、特征值与方程组求解

一、数组与矩阵的区别

特性 数组(ndarray) 矩阵(matrix)
维度 可以是一维、二维、三维或更高维 只能是二维
数据类型 可包含数字、字符串或其他对象 只能包含数字
索引方式 x[1,1]x[1][1] 含义相同 x[1,1]x[1][1] 含义不同
python 复制代码
import numpy as np

x = np.matrix([[1,2,3], [4,5,6]])
y = np.matrix([1,2,3,4,5,6])

print(x[1,1])    # 返回行下标和列下标都为1的元素

二、矩阵生成与转置

python 复制代码
import numpy as np

x = np.matrix([[1,2,3], [4,5,6]])

# 矩阵转置
print(x.T)        # 行列互换
print(x.T.T)      # 转置再转置,还原

三、矩阵的统计操作

python 复制代码
x = np.matrix([[1,2,3], [4,5,6]])

x.mean()              # 所有元素的平均值
x.mean(axis=0)        # 纵向平均值(axis=0,按列计算)
x.mean(axis=1)        # 横向平均值(axis=1,按行计算)
x.sum()               # 所有元素的和
x.max(axis=0)         # 纵向最大值
x.max(axis=1)         # 横向最大值
x.argmax(axis=0)      # 纵向最大值的下标
x.argmax(axis=1)      # 横向最大值的下标
x.diagonal()          # 对角线元素
x.nonzero()           # 非0元素的下标(分别返回行下标和列下标)

axis记忆法axis=0 是纵向(从上往下),axis=1 是横向(从左往右)。

四、相关系数矩阵

相关系数矩阵是一个对称矩阵,对角线元素都是1(自相关系数),非对角线元素表示两个变量的相关程度:

  • 大于0:正相关(一个变大,另一个也变大)
  • 小于0:负相关(一个变大,另一个变小)
  • 绝对值越接近1,相关性越强
python 复制代码
print(np.corrcoef([1,2,3,4], [4,3,2,1]))    # 负相关
print(np.corrcoef([1,2,3,4], [1,2,3,4]))    # 正相关
print(np.corrcoef([1,2,3,4], [1,2,3,40]))   # 正相关,趋势接近

五、方差、协方差、标准差

python 复制代码
x = [-2.1, -1, 4.3]
y = [3, 1.1, 0.12]

X = np.vstack((x, y))     # 垂直堆叠两个数组

np.cov(X)                  # 协方差矩阵
np.cov(x, y)               # x和y的协方差
np.cov(x)                  # x的方差
np.std(X)                  # 标准差
np.std(X, axis=1)          # 可以指定axis横向或纵向计算

概念区分

  • 方差:衡量一组数据自身的离散程度
  • 协方差:衡量两组数据变化趋势的一致程度
  • 标准差:方差的平方根,量纲与原数据一致

六、特征值与特征向量

直观理解

  • 矩阵乘以一个向量 = 对这个向量进行变换(旋转 + 缩放)
  • 如果向量只发生缩放 没有旋转 → 这个向量就是特征向量 ,缩放的比例就是特征值
  • 特征值越大,表示这个方向对原向量的表达越重要
python 复制代码
A = np.array([[1, -3, 3], [3, -5, 3], [6, -6, 4]])

e, v = np.linalg.eig(A)       # 特征值(e)与特征向量(v)
np.dot(A, v)                   # 矩阵与特征向量的乘积
e * v                          # 特征值与特征向量的乘积
np.isclose(np.dot(A, v), e*v)  # 验证二者是否相等

# 行列式|A-λE|的值应为0
np.linalg.det(A - np.eye(3,3) * e)

七、逆矩阵

python 复制代码
x = np.matrix([[1,2,3], [4,5,6], [7,8,0]])
y = np.linalg.inv(x)  # 计算逆矩阵

x * y                 # 矩阵乘以它的逆,结果为单位矩阵

八、求解线性方程组

python 复制代码
a = np.array([[3, 1], [1, 2]])   # 系数矩阵
b = np.array([9, 8])              # 常数向量

x = np.linalg.solve(a, b)         # 求解
np.dot(a, x)                      # 验证:应该等于b

np.linalg.lstsq(a, b)             # 最小二乘解(返回解、余项、秩、奇异值)

九、奇异值分解(SVD)

python 复制代码
a = np.matrix([[1,2,3], [4,5,6], [7,8,9]])

u, s, v = np.linalg.svd(a)    # 奇异值分解

# 可以用 u、s、v 重构原矩阵
u * np.diag(s) * v              # 还原为原矩阵

今日核心总结

  1. 矩阵 vs 数组:矩阵只能是二维且只能包含数字;数组可以多维,可以包含多种数据类型。

  2. 核心统计操作

    • axis=0 纵向,axis=1 横向
    • mean()sum()max()argmax() 必须掌握
  3. 相关系数矩阵np.corrcoef() 判断两个变量变化趋势是否一致。

  4. 方差/协方差/标准差

    • np.cov() 协方差,np.std() 标准差
    • np.vstack() 垂直堆叠数组
  5. 线性代数核心

    • 特征值与特征向量:np.linalg.eig()
    • 逆矩阵:np.linalg.inv()
    • 解线性方程组:np.linalg.solve()
    • 奇异值分解:np.linalg.svd()

结合你的项目想一想

  • 相关系数:分析图书价格和库存数量之间是否存在相关性
  • 统计分析 :用 mean()std() 快速计算图书价格的统计特征
  • 线性方程组 :在实际业务中用于求解多变量优化问题
    注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。
    很多地方我不太理解,等下我会生成更简单的总结出来,因为本人的数学不是很好。