Numpy之线性代数

Posted 陨星落云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy之线性代数相关的知识,希望对你有一定的参考价值。

文章目录

矩阵

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.8047288  0.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 = A i , j ± B i , 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)矩阵数乘:一个数乘以一个矩阵。

数学公式: ( c A ) i , j = c ⋅ A i , j (cA)_i,_j=c·A_i,_j (cA)i,j=cAi,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 = 1 m ∑ j = 1 n A i , 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=1mj=1nAi,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 = 1 m ∏ j = 1 n A i , 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=1mj=1nAi,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。
数学公式: A i j 3 = A i j × A i j × A i j A_{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]]
[[  0   1   8]
 [ 27  64 125]
 [216 343 512]]
3. 矩阵的乘法

(1)矩阵各元素的积:矩阵的点乘同维对应元素的相乘。当矩阵的维度不同时,会根据一定的广播规则将维数扩充到一致的形式。
数学公式: ( A × B ) i , j = A i , j × B i , 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]]
[[ 0  1  4]
 [ 9 16 25]
 [36 49 64]]

(2)矩阵内积

数学公式: [ A , B ] i , j = A i , 1 B 1 , j + A i , 2 B 2 , j + ⋯ + A i n B n j = ∑ r = 1 n A i , r B r , 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,1B1,j+Ai,2B2,j++AinBnj=r=1nAi,rBr,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)向量内积、外积

向量内积: x T y = ∑ i = 1 n x i y i x^{T} y=\\sum_{i=1}^{n} x_{i} y_{i} xTy=i=1nxiyi

向量外积: x y T = ( x 1 y 1 ⋯ x 1 y n ⋮ ⋮ x m y 1 ⋯ x m y n ) 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=x1y1xmy1x1ynxmyn

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
外积:
[[-2  4  2]
 [-1  2  1]
 [ 0  0  0]]

(4)向量叉乘(叉积):运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。

数学公式:

$$
a=\\left(x_{1}, y_{1}, z_{1}\\right)

b=\\left(x_{2}, y_{2}, z_{2}\\right)

$$

a × b = ∣ i j k x 1 y 1 z 1 x 2 y 2 z 2 ∣ = ( y 1 z 2 − y 2 z 1 ) i − ( x 1 z 2 − x 2 z 1 ) j + ( x 1 y 2 − x 2 y 1 ) k a \\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=ix1x2jy1y2kz1z2=(y1z2y2z1)i(x1z2x2z1)j+(x1y2x2y1)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 = ( y 1 z 2 − y 2 z 1 , − ( x 1 z 2 − x 2 z 1 ) , x 1 y 2 − x 2 y 1 ) 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=(y1z2y2z1,(x1z2x2z1),x1y2x2y1)

例1、已知,a =(2,1,0),b =(-1,2,1),试求(1) a × b a\\times b a×b(2) b × a b\\times a b×a
解:(1) a × b a\\times b a×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 -2  5]
[-1  2 -5]
4. 矩阵的转置

数学公式: ( A T ) i j = A i j (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]
 [以上是关于Numpy之线性代数的主要内容,如果未能解决你的问题,请参考以下文章

Numpy之线性代数

Python之Numpy:线性代数/矩阵运算

进阶第十五课 Python模块之Numpy

Python数据分析之numpy学习

(转)Python数据分析之numpy学习

python数据分析进阶之numpy