一、数组与矩阵的区别
| 特性 | 数组(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 # 还原为原矩阵
今日核心总结
-
矩阵 vs 数组:矩阵只能是二维且只能包含数字;数组可以多维,可以包含多种数据类型。
-
核心统计操作:
axis=0纵向,axis=1横向mean()、sum()、max()、argmax()必须掌握
-
相关系数矩阵 :
np.corrcoef()判断两个变量变化趋势是否一致。 -
方差/协方差/标准差:
np.cov()协方差,np.std()标准差np.vstack()垂直堆叠数组
-
线性代数核心:
- 特征值与特征向量:
np.linalg.eig() - 逆矩阵:
np.linalg.inv() - 解线性方程组:
np.linalg.solve() - 奇异值分解:
np.linalg.svd()
- 特征值与特征向量:
结合你的项目想一想
- 相关系数:分析图书价格和库存数量之间是否存在相关性
- 统计分析 :用
mean()、std()快速计算图书价格的统计特征 - 线性方程组 :在实际业务中用于求解多变量优化问题
注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。
很多地方我不太理解,等下我会生成更简单的总结出来,因为本人的数学不是很好。