将相本无种,男儿当自强。这篇文章主要讲述Numpy之线性代数相关的知识,希望能为你提供帮助。
文章目录
- 矩阵
- 1. 矩阵初始化
- 2. 矩阵元素运算
- 3. 矩阵的乘法
- 4. 矩阵的转置
- 5. 矩阵对应列行的最大值,最小值,和
- 6. 矩阵的其他操作:行列数、切片、复制、比较
- 7. 矩阵的行列式
- 8. 矩阵的逆和伪逆
- 9. 矩阵的对称
- 10. 矩阵的秩
- 11. 可逆矩阵的求解
- 12. 矩阵的特征值与特征向量(EVD)
- 13. 奇异值分解(SVD)
矩阵
1. 矩阵初始化 Numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处理行列表示的数字元素,虽然他们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,其中Numpy函数库中的matrix与MATLAB中matrices等价。
getA()是numpy的一个函数,作用是将矩阵转成一个ndarray,getA()函数和mat()函数的功能相反,是将一个矩阵转化为数组。
数组array 矩阵的初始化
import numpy as np# 全零矩阵myZero = np.zeros([3,3])
print(myZero)
print(type(myZero))# 全一矩阵myOnes = np.ones([3,3])
print(myOnes)
print(type(myOnes))# 单位矩阵myEye = np.eye(3)
print(myEye)
print(type(myEye))# 对称矩阵a1 = [1.,2.,3.]
myDiag = np.diag(a1)
print(myDiag)
print(type(myDiag))# 随机矩阵myRand = np.random.rand(3,3)
print(myRand)
print(type(myRand))
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
<
class \'numpy.ndarray\'>
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
<
class \'numpy.ndarray\'>
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
<
class \'numpy.ndarray\'>
[[1. 0. 0.]
[0. 2. 0.]
[0. 0. 3.]]
<
class \'numpy.ndarray\'>
[[0.80472880.08855086 0.01365475]
[0.27463797 0.61934569 0.59620009]
[0.01570598 0.54358429 0.5640885 ]]
<
class \'numpy.ndarray\'>
矩阵matrix矩阵的初始化
- 通过mat()函数将目标数据的类型转化成矩阵(matrix)
a1 = [1.,2.,3.]
myDiag = np.mat(np.diag(a1))
print(myDiag)
print(type(myDiag))
[[1. 0. 0.]
[0. 2. 0.]
[0. 0. 3.]]
<
class \'numpy.matrix\'>
- 直接创建
a = np.mat(\'1 2 3;
4 5 6;
7 8 9\')
print(a)
b = np.mat([[1,2,3],[4,5,6],[7,8,9]])
print(b)
c = np.mat(np.arange(9).reshape(3,3))
print(c)
print(type(c))
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[0 1 2]
[3 4 5]
[6 7 8]]
<
class \'numpy.matrix\'>
2. 矩阵元素运算 矩阵的元素运算是指矩阵在元素级别的加、减、乘、除运算。
(1)元素相加和相减。
条件:矩阵的行数和列数必须相同。
数学公式:(A±B)i,j=Ai,j±Bi,j(A±B)_i,_j=A_i,_j±B_i,_j(A±B)i?,j?=Ai?,j?±Bi?,j?
myOnes = np.ones([4,4])
myEye = np.eye(4)
print(myOnes+myEye)
print(myOnes-myEye)
[[2. 1. 1. 1.]
[1. 2. 1. 1.]
[1. 1. 2. 1.]
[1. 1. 1. 2.]]
[[0. 1. 1. 1.]
[1. 0. 1. 1.]
[1. 1. 0. 1.]
[1. 1. 1. 0.]]
(2)矩阵数乘:一个数乘以一个矩阵。
数学公式:(cA)i,j=c?Ai,j(cA)_i,_j=c·A_i,_j(cA)i?,j?=c?Ai?,j?
mymat = np.arange(9).reshape(3,3)
print(mymat)
print(10*mymat)
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ 0 10 20]
[30 40 50]
[60 70 80]]
(3)矩阵所有元素求和。
数学公式:其中sum?(A)=∑i=1m∑j=1nAi,j=1其中,1< i< m,1< j< n其中\\operatorname{sum}(A)=\\sum_{i=1}^{m} \\sum_{j=1}^{n} A_{i, j}=1 其中, 1< i< m, 1< j< n其中sum(A)=∑i=1m?∑j=1n?Ai,j?=1其中,1< i< m,1< j< n
mymat = np.arange(9).reshape(3,3)
print(mymat)
print(np.sum(mymat))
[[0 1 2]
[3 4 5]
[6 7 8]]
36
(4)矩阵所有元素之积
数学公式:其中product?(A)=∏i=1m∏j=1nAi,j=1其中,1< i< m,1< j< n其中\\operatorname{product}(A)=\\prod_{i=1}^{m} \\prod_{j=1}^{n} A_{i, j}=1 其中, 1< i< m, 1< j< n其中product(A)=∏i=1m?∏j=1n?Ai,j?=1其中,1< i< m,1< j< n
mymat = np.arange(4).reshape(2,2)+1
print(mymat)
print(np.product(mymat))
[[1 2]
[3 4]]
24
(5)矩阵各元素的n次幂:n=3。
数学公式:Aij3=Aij×Aij×AijA_{ij}^3=A_{ij}×A_{ij}×A_{ij}Aij3?=Aij?×Aij?×Aij?
mymat = np.arange(9).reshape(3,3)
print(mymat)
print(np.power(mymat,3))
[[0 1 2]
[3 4 5]
[6 7 8]]
[[018]
[ 2764 125]
[216 343 512]]
3. 矩阵的乘法 (1)矩阵各元素的积:矩阵的点乘同维对应元素的相乘。当矩阵的维度不同时,会根据一定的广播规则将维数扩充到一致的形式。
数学公式:(A×B)i,j=Ai,j×Bi,j(A×B)_i,_j =A_i,_j×B_i,_j(A×B)i?,j?=Ai?,j?×Bi?,j?
mymat = np.arange(9).reshape(3,3)
print(mymat)
print(np.multiply(mymat,mymat))
[[0 1 2]
[3 4 5]
[6 7 8]]
[[ 014]
[ 9 16 25]
[36 49 64]]
(2)矩阵内积
数学公式:[A,B]i,j=Ai,1B1,j+Ai,2B2,j+?+AinBnj=∑r=1nAi,rBr,j°[\\boldsymbol{A}, \\boldsymbol{B}]_{i, j}=\\boldsymbol{A}_{i, 1} \\boldsymbol{B}_{1, j}+\\boldsymbol{A}_{i, 2} \\boldsymbol{B}_{2, j}+\\cdots+\\boldsymbol{A}_{i n} \\boldsymbol{B}_{n j}=\\sum_{r=1}^{n} \\boldsymbol{A}_{i, r} \\boldsymbol{B}_{r, j^{\\circ}}[A,B]i,j?=Ai,1?B1,j?+Ai,2?B2,j?+?+Ain?Bnj?=∑r=1n?Ai,r?Br,j°?
# 数组array
a = np.arange(9).reshape(3,3)
b = np.ones([3,3])
print(a)
print(b)
print(np.dot(a,b))
# 矩阵matrix
c = np.mat(a)
d = np.mat(b)
print(c*d)
[[0 1 2]
[3 4 5]
[6 7 8]]
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
[[ 3.3.3.]
[12. 12. 12.]
[21. 21. 21.]]
[[ 3.3.3.]
[12. 12. 12.]
[21. 21. 21.]]
(3)向量内积、外积
向量内积:xTy=∑i=1nxiyix^{T} y=\\sum_{i=1}^{n} x_{i} y_{i}xTy=∑i=1n?xi?yi?
向量外积:xyT=(x1y1?x1yn??xmy1?xmyn)x y^{T}=\\left(\\begin{array}{ccc}{x_{1} y_{1}} & {\\cdots} & {x_{1} y_{n}} \\\\ {\\vdots} & {} & {\\vdots} \\\\ {x_{m} y_{1}} & {\\cdots} & {x_{m} y_{n}}\\end{array}\\right)xyT=????x1?y1??xm?y1?????x1?yn??xm?yn??????
a = [2,1,0]
b = [-1,2,1]
print(a)
print(b)
print(np.dot(a,b))
print(np.outer(a,b))
[2, 1, 0]
[-1, 2, 1]
内积:0
外积:
[[-242]
[-121]
[ 000]]
(4)向量叉乘(叉积):运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。
数学公式:
$$
a=\\left(x_{1}, y_{1}, z_{1}\\right)
b=\\left(x_{2}, y_{2}, z_{2}\\right)
【Numpy之线性代数】$$
a×b=∣ijkx1y1z1x2y2z2∣=(y1z2?y2z1)i?(x1z2?x2z1)j+(x1y2?x2y1)ka \\times b=\\left|\\begin{array}{ccc}{\\mathrm{i}} & {\\mathrm{j}} & {\\mathrm{k}} \\\\ {x_{1}} & {y_{1}} & {z_{1}} \\\\ {x_{2}} & {y_{2}} & {z_{2}}\\end{array}\\right|=\\left(y_{1} z_{2}-y_{2} z_{1}\\right) i-\\left(x_{1} z_{2}-x_{2} z_{1}\\right) j+\\left(x_{1} y_{2}-x_{2} y_{1}\\right) k a×b=∣∣∣∣∣∣?ix1?x2??jy1?y2??kz1?z2??∣∣∣∣∣∣?=(y1?z2??y2?z1?)i?(x1?z2??x2?z1?)j+(x1?y2??x2?y1?)k
其中
i=(1,0,0)j=(0,1,0)k=(0,0,1)i=(1,0,0) \\quad j=(0,1,0) \\quad \\mathrm{k}=(0,0,1) i=(1,0,0)j=(0,1,0)k=(0,0,1)
根据i、j、k间关系,有:
a×b=(y1z2?y2z1,?(x1z2?x2z1),x1y2?x2y1)a \\times b=\\left(y_{1} z_{2}-y_{2} z_{1},-\\left(x_{1} z_{2}-x_{2} z_{1}\\right), x_{1} y_{2}-x_{2} y_{1}\\right) a×b=(y1?z2??y2?z1?,?(x1?z2??x2?z1?),x1?y2??x2?y1?)
例1、已知,a =(2,1,0),b =(-1,2,1),试求(1)a×ba\\times ba×b(2)b×ab\\times ab×a
解:(1)a×ba\\times ba×b =(1,-2,5):(2)$ b\\times a$ =(-1,2,5)
a = [2,1,0]
b = [-1,2,1]
print()
print(np.cross(a,b))
print(np.cross(b,a))
[ 1 -25]
[-12 -5]
4. 矩阵的转置 数学公式:(AT)ij=Aij(A^T)_{ij} = A_{ij}(AT)ij?=Aij?
a = np.arange(9).reshape(3,3)
print(a)
print(a.T)
print(a.transpose())
[[0 1 2]
[3 4 5]
[6 7 8]]
[[0 3 6]
[1 4 7]
[2 5 8]]
[[0 3 6]
[1 4 7]
[2 5 8]]
5. 矩阵对应列行的最大值,最小值,和
# 随机生成一个0-9的3×3矩阵
a = np.random.randint(0,10,(3,3))
print(a)
# 矩阵中的最大值
print(a.max())
# 计算矩阵中最大值的对应索引
print(np.argmax(a))
# 矩阵列中的最小值
print(a.min(axis=0))
# 计算矩阵列中最小值对应的列索引
print(np.argmin(a,0))
# 矩阵列求和
print(a.sum(axis=0))
# 矩阵行求和
print(a.sum(axis=1))
[[3 3 7]
[9 8 5]
[4 7 0]]
9
3
[3 3 0]
[0 0 2]
[16 18 12]
[13 22 11]
6. 矩阵的其他操作:行列数、切片、复制、比较
mymat = (np.arange(9)+1).reshape(3,3)
mymat1 = np.random.randint(0,10,(3,3))
print(\'mymat:\',mymat)
print(\'mymat1:\',mymat1)[m,n] = np.shape(mymat)
print(\'矩阵的行列数:\',m,n)
myscl1 = mymat[1]
print(\'按行切片:\',myscl1)
myscl2 = mymat.T[1]
print(\'按列切片:\',myscl2)
mymatcopy =mymat.copy()
print(\'复制矩阵:\',mymatcopy)
# 比较
print(\'矩阵元素比较:\\n\',mymat<
mymat1)
mymat: [[1 2 3]
[4 5 6]
[7 8 9]]
mymat1: [[1 3 7]
[
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- java读取txt文件
- 穷举搜索的例子(Google方程式(Java题解))
- Canny 边缘检测
- 2021年数字货币时代加速到来
- 非线性方程组求解
- 图像梯度
- 区块链十年与传统金融的变化
- 形态学操作
- 阈值处理