码农眼中的数学之~矩阵专栏(附Numpy讲解)
2.矩阵专栏¶
吐槽一下:矩阵本身不难,但是矩阵的写作太蛋疼了 (⊙﹏⊙)汗
还好有Numpy
,不然真的崩溃了...
LaTex
有没有一个集成了很多常用公式
以及推导
或者含题库
的在线编辑器?
代码裤子:https://github.com/lotapp/BaseCode
在线编程系:https://mybinder.org/v2/gh/lotapp/BaseCode/master
数学基础:https://www.cnblogs.com/dotnetcrazy/p/9294292.html
Numpy基础:https://www.cnblogs.com/dotnetcrazy/p/9309555.html
在线预览:http://github.lesschina.com/python/ai/math/矩阵专栏.html
2.1.矩阵的定义¶
矩阵:是一个按照长方阵列排列的复数或实数集合。
通俗讲就是:把数排成m行n列后,然后用中括号把它们括住,这种形式的组合就是矩阵了~ eg:
比如上面这个示例就是一个m × n
的矩阵(m行n列的矩阵),如果m=n
那么就叫做n阶方阵
,eg:
这个就是3阶
方阵
如果回到中学,老师肯定都是通过一次方程组来引入矩阵(逆天的老师是这么讲的):
==>
如果你方程组都忘记怎么解的话...好吧还是说下吧:“比如这题,可以先把x2移到右边,这样x1就等于一个表达式了(x1=-x2-1),然后带入第二个表达式就可以解出x1和x2了,一次的其实两个表达式就可以解出了,剩下的你可以把值带进去验证一下”
2.2.矩阵的运算(含幂运算)¶
2.2.1.加、减¶
加减比较简单,就是对应元素相加减 (只有行列都相同的矩阵
才可以进行)
就不用麻烦的LaTex
一行行打了,咱们用更方便的 NumPy 来演示一下矩阵加法(不懂代码的直接看结果,不影响阅读的)
Numpy有专门的矩阵函数(np.mat),用法和ndarray差不多
,我们这边使用经常使用ndarray
类型,基础忘记了可以去查看一下:Numpy基础
扩展:矩阵的加法运算满足交换律:A + B = B + A (乘法不行)
import numpy as np
# 创建两个集合
A = np.arange(1,10).reshape((3,3))
B = np.arange(9).reshape((3,3))
print(A)
print("-"*5)
print(B)
# 加法
A + B
# 和A+B相等
B + A
# 减法
A - B
################ 变化来了 ################
# 之前说过 ”只有行列都相同的矩阵才可以进行“ 来验证一下
# 创建一个2行3列的矩阵
C = np.arange(6).reshape((2,3))
D = np.arange(6).reshape((3,2))
print(C)
print("-"*5)
print(D)
# 2行3列的矩阵 + 3行2列的矩阵
C + D # 不同形状的矩阵不能进行加运算
C - D # 不同形状的矩阵不能进行减运算
print(A)
# 比如2×A,A原本的每一个元素都扩大了两倍
2 * A
print(A)
# 友情提醒:Numpy里面的运算基本上都是针对每一个元素
A / 2
2.2.3.矩阵乘法¶
矩阵乘法还是要用LaTex
演示一下的,不然有些朋友可能还是觉得比较抽象:(大家有什么好用的LaTex在线编辑器可以推荐的)
拿上面那个方程组来演示一下:
稍微变化一下就更形象了:
举个简单的例子:A×B
以后记不得怎么乘就自己推一下,值得注意的是:
两个矩阵的乘法仅当第一个矩阵A的列数(column)和另一个矩阵B的行数(row)相等才可以进行计算
你这样想就记得了:
# 通过代码看一看
A = np.array([[1,2],[3,4]])
B = np.array([[4,3],[2,1]])
print(A)
print("-"*5)
print(B)
# 注意一下,Numpy里面的乘法默认是每个数对应相乘
# 如果是矩阵相乘可以使用dot()方法
# 或者你创建矩阵对象,这样×默认就是矩阵乘法了
A.dot(B) # 矩阵A×矩阵B
程序验证了我们上面的运算结果,还得注意一下:
A×B
和B×A
是不一样的,eg:B×A
如果你乘着乘着就忘记到底怎么乘,就把右边的矩阵换成x1,x2,然后就会了
print(A)
print("-"*5)
print(B)
B.dot(A) # 矩阵B×矩阵A
################ 变化来了 ################
# 来验证一下”两个矩阵的乘法仅当第一个矩阵A的列数(column)和另一个矩阵D的行数(row)相等才可以进行计算“
print(A)
print("-"*5)
print(D)
# A有2列 D有3行
A.dot(D) # 不能乘
# 你反过来就符合A的列数=D的行数了
D.dot(A)
print(A)
print("-"*5)
print(C)
# 幂乘(每个元素开平方)
np.power(A,2) # 使用 A**2也一样
# 幂乘(不一定是方阵)
np.power(C,2)
################ 方阵幂运算 ################
# A*A*A
np.linalg.matrix_power(A,3)
# 不是方阵就over
np.linalg.matrix_power(C,3)
来个小结 + 扩展:
矩阵的加法运算满足交换律:A + B = B + A
矩阵的乘法满足结合律和对矩阵加法的分配律:
结合律:(AB)C = A(BC)
左分配律:(A + B)C = AC + BC
右分配律:C(A + B) = CA + CB
矩阵的乘法与数乘运算之间也满足类似结合律的规律;与转置之间则满足倒置的
分配律:c(A + B) = cA + cB
结合律:c(AB) = (cA)B = A(cB)
矩阵乘法不满足交换律 一般来说,矩阵A及B的乘积AB存在,但BA不一定存在,即使存在,大多数时候AB ≠ BA
2.3.特殊矩阵¶
2.3.1.零矩阵¶
零矩阵就是所有的元素都是0
同样的:全1矩阵就是所有元素都是1
import numpy as np
# 一维
# 可以指定类型 np.zeros(5,dtype=int)
np.zeros(5) # 完整写法:np.zeros((5,))
# 二维
np.zeros((2,5))# 建议用元组,官方文档都是元组
# 三维 ==> 可以这么理解,2个2*5(2行5列)的矩阵
np.zeros((2,2,5))
################ 全1矩阵 ################
# `np.ones(tuple)` 用法和`np.zeros(tuple)`差不多
# 可以指定类型 np.ones(5,dtype=int)
# 一维
np.ones(5) # 完整写法 np.ones((5,))
# 二维,传一个shape元组
np.ones((2,5))
# 三维 可以理解为两个二维数组
np.ones((2,2,5))
################ 指定值矩阵 ################
# 创建指定值的矩阵:
np.full((3,5),222)
# 创建指定值的矩阵,浮点类型
np.full((3,5),222.0)
A = np.arange(6).reshape((2,3))
print(A)
# 转置矩阵(行列互换)
A.T
B = np.random.randint(10,size=(2,3))
print(B)
################ 验证系列 ################
# 验证一下(A+B)^T=A^T+B^T
print(A.T + B.T)
print("-"*5)
print((A+B).T)
# 验证一下(A+B)^T=A^T+B^T
# 其实也再一次验证了,Numpy运算符默认是对每一个元素的操作
(A+B).T == A.T + B.T
################ 验证系列 ################
# 把A变成3*2的矩阵,不够元素用0补
# reshape:有返回值,不对原始多维数组进行修改
# resize:无返回值,会对原始多维数组进行修改
A.resize(3,2)
print(A)
print(B)
# 验证(AB)^T=B^T×A^T
print((A.dot(B)).T)
print("-"*5)
print((B.T).dot(A.T))
# 创建一个5行4列矩阵
A = np.random.randint(10,size=(4,4))
print(A)
# 上三角
np.triu(A)
# 下三角
np.tril(A)
# 验证一下最后一个性质
# 三角矩阵的逆矩阵也仍然是三角矩阵
print(np.triu(A).T)
print('-'*5)
print(np.tril(A).T)
# 简单创建
np.diag([3,9,6])
np.diag([2,2,2])
################ 验证系列 ################
# np.diag?
print(A)
# 获取对角元素,然后再生成对角矩阵
B = np.diag(A.diagonal()) #或者 np.diag(np.diag(A))
print(B)
B.dot(B).dot(B)
# 对角矩阵的矩阵幂运算等于其对应元素的幂运算
B**3
# 定义一个2行的单位矩阵(列默认和行一致)
# np.eye(rows,columns=rows)
np.eye(2)
################ 验证扩展 ################
# 可以指定类型
B = np.eye(4,dtype=int)
print(B)
print(A)
# 任何矩阵 x 单位矩阵 都等于其本身
A.dot(B)
# 反过来也一样(这个和1*a=a*1一个道理)
B.dot(A)
A = np.random.randint(10,size=(4,4))
print(A)
B = np.triu(A)
B += B.T - np.diag(A.diagonal())
print(B)
# 验证一下
B.T == B
################ 分步解释 ################
# 创建上三角矩阵
B = np.triu(A)
print(B)
# 上三角+它的逆矩阵(发现距离对角矩阵只是多加一次对角线上的元素)
B += B.T
print(B)
# 所以减去对角线上的元素,得到对角矩阵
B - np.diag(A.diagonal())
A = np.array([[3,2],[1,2]])
print(A)
# 求A的逆矩阵
np.linalg.inv(A)
A = np.array([[7, 3, 6],[5, 3, 1]])
print(A)
# 不等于0就是可逆
np.linalg.det(A)
# 必须是方阵的验证
np.linalg.inv(A)
# 有时候还是需要求逆矩阵
# 那就可以求它的伪逆矩阵
X = np.linalg.pinv(A)
print(X)
# A*X*A=A
A.dot(X).dot(A)
# X*A*X=X
X.dot(A).dot(X)
################ 简单说下mat ################
# 创建一个矩阵
A = np.mat([[3,2],[1,2]])
print(A)
type(A)
# 求它的逆矩阵
A.I
# A^T
A.T
# *默认就是矩阵乘法
A * A
# 更多自己查看下帮助文档把,用法和array基本上一样,
# 我这边只是简单提一下,怕你们不去看(所有和矩阵相关的东西,里面都有封装,很方便)
np.mat?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?