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=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
=
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=1m∑j=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=1m∏j=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=⎝⎜⎛x1y1⋮xmy1⋯⋯x1yn⋮xmyn⎠⎟⎞
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∣∣∣∣∣∣=(y1z2−y2z1)i−(x1z2−x2z1)j+(x1y2−x2y1)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=(y1z2−y2z1,−(x1z2−x2z1),x1y2−x2y1)
例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之线性代数的主要内容,如果未能解决你的问题,请参考以下文章