Numpy之线性代数

将相本无种,男儿当自强。这篇文章主要讲述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] [

    推荐阅读