本文主讲Python中Numpy数组的类型、全0全1数组的生成、随机数组、数组操作、矩阵的简单运算、矩阵的数学运算。
尽管可以用python中list嵌套来模拟矩阵,但使用Numpy库更方便。
定义数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
>>> import numpy as np
>>> m = np.array([[ 1 , 2 , 3 ], [ 2 , 3 , 4 ]]) #定义矩阵,int64
>>> m
array([[ 1 , 2 , 3 ],
[ 2 , 3 , 4 ]])
>>> m = np.array([[ 1 , 2 , 3 ], [ 2 , 3 , 4 ]], dtype = np. float ) #定义矩阵,float64
>>> m
array([[ 1. , 2. , 3. ],
[ 2. , 3. , 4. ]])
>>> print (m.dtype) #数据类型
float64
>>> print (m.shape) #形状2行3列
( 2 , 3 )
>>> print (m.ndim) #维数
2
>>> print (m.size) #元素个数
6
>>> print ( type (m))
< class 'numpy.ndarray' >
|
还有一些特殊的方法可以定义矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
>>> m = np.zeros(( 2 , 2 )) #全0
>>> m
array([[ 0. , 0. ],
[ 0. , 0. ]])
>>> print ( type (m)) #也是ndarray类型
< class 'numpy.ndarray' >
>>> m = np.ones(( 2 , 2 , 3 )) #全1
>>> m = np.full(( 3 , 4 ), 7 ) #全为7
>>> np.eye( 3 ) #单位矩阵
array([[ 1. , 0. , 0. ],
[ 0. , 1. , 0. ],
[ 0. , 0. , 1. ]])
>>> np.arange( 20 ).reshape( 4 , 5 ) #生成一个4行5列的数组
>>>
>>> np.random.random(( 2 , 3 )) #[0,1)随机数
array([[ 0.51123127 , 0.40852721 , 0.26159126 ],
[ 0.42450279 , 0.34763668 , 0.06167501 ]])
>>> np.random.randint( 1 , 10 ,( 2 , 3 )) #[1,10)随机整数的2行3列数组
array([[ 5 , 4 , 9 ],
[ 2 , 5 , 7 ]])
>>> np.random.randn( 2 , 3 ) #正态随机分布
array([[ - 0.29538656 , - 0.50370707 , - 2.05627716 ],
[ - 1.50126655 , 0.41884067 , 0.67306605 ]])
>>> np.random.choice([ 10 , 20 , 30 ], ( 2 , 3 )) #随机选择
array([[ 10 , 20 , 10 ],
[ 30 , 10 , 20 ]])
>>> np.random.beta( 1 , 10 ,( 2 , 3 )) #贝塔分布
array([[ 0.01588963 , 0.12635485 , 0.22279098 ],
[ 0.08950147 , 0.02244569 , 0.00953366 ]])
|
操作数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
>>> from numpy import *
>>> a1 = array([ 1 , 1 , 1 ]) #定义一个数组
>>> a2 = array([ 2 , 2 , 2 ])
>>> a1 + a2 #对于元素相加
array([ 3 , 3 , 3 ])
>>> a1 * 2 #乘一个数
array([ 2 , 2 , 2 ])
##
>>> a1 = np.array([ 1 , 2 , 3 ])
>>> a1
array([ 1 , 2 , 3 ])
>>> a1 * * 3 #表示对数组中的每个数做立方
array([ 1 , 8 , 27 ])
##取值,注意的是它是以0为开始坐标,不matlab不同
>>> a1[ 1 ]
2
##定义多维数组
>>> a3 = np.array([[ 1 , 2 , 3 ],[ 4 , 5 , 6 ]])
>>> a3
array([[ 1 , 2 , 3 ],
[ 4 , 5 , 6 ]])
>>> a3[ 0 ] #取出第一行的数据
array([ 1 , 2 , 3 ])
>>> a3[ 0 , 0 ] #第一行第一个数据
1
>>> a3[ 0 ][ 0 ] #也可用这种方式
1
>>> a3
array([[ 1 , 2 , 3 ],
[ 4 , 5 , 6 ]])
>>> a3. sum (axis = 0 ) #按行相加,列不变
array([ 5 , 7 , 9 ])
>>> a3. sum (axis = 1 ) #按列相加,行不变
array([ 6 , 15 ])
|
矩阵的数学运算
关于方阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
>>> m = np.array([[ 1 , 2 , 3 ], [ 2 , 2 , 3 ], [ 2 , 3 , 4 ]]) #定义一个方阵
>>> m
array([[ 1 , 2 , 3 ],
[ 2 , 2 , 3 ],
[ 2 , 3 , 4 ]])
>>> print (np.linalg.det(m)) #求行列式
1.0
>>> print (np.linalg.inv(m)) #求逆
[[ - 1. 1. 0. ]
[ - 2. - 2. 3. ]
[ 2. 1. - 2. ]]
>>> print (np.linalg.eig(m)) #特征值 特征向量
(array([ 7.66898014 + 0.j , - 0.33449007 + 0.13605817j ,
- 0.33449007 - 0.13605817j ]), array([[ - 0.47474371 + 0.j , - 0.35654645 + 0.23768904j ,
- 0.35654645 - 0.23768904j ],
[ - 0.53664812 + 0.j , 0.80607696 + 0.j ,
0.80607696 - 0.j ],
[ - 0.6975867 + 0.j , - 0.38956192 - 0.12190158j ,
- 0.38956192 + 0.12190158j ]]))
>>> y = np.array([ 1 , 2 , 3 ])
>>> print (np.linalg.solve(m, y)) #解方程组
[ 1. 3. - 2. ]
|
矩阵乘法
矩阵乘:按照线性代数的乘法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> a = np.array([[ 1 , 2 , 3 ], [ 2 , 3 , 4 ]])
>>> b = np.array([[ 1 , 2 ], [ 3 , 4 ], [ 5 , 6 ]])
>>> a
array([[ 1 , 2 , 3 ],
[ 2 , 3 , 4 ]])
>>> b
array([[ 1 , 2 ],
[ 3 , 4 ],
[ 5 , 6 ]])
>>> np.dot(a, b) #方法一
array([[ 22 , 28 ],
[ 31 , 40 ]])
>>> np.matmul(a,b) #方法二
array([[ 22 , 28 ],
|
注:一维数组之间运算时,dot()表示的是内积。
点乘:对应位置相乘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> a = np.array([[ 1 , 2 ],[ 3 , 4 ]])
>>> b = np.array([[ 1 , 1 ],[ 2 , 2 ]])
>>> a
array([[ 1 , 2 ],
[ 3 , 4 ]])
>>> b
array([[ 1 , 1 ],
[ 2 , 2 ]])
>>> a * b #方法一
array([[ 1 , 2 ],
[ 6 , 8 ]])
>>> np.multiply(a, b) #方法二
array([[ 1 , 2 ],
[ 6 , 8 ]])
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/lfri/p/10561001.html