本文主讲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