本篇主要介绍numpy中的数组操作:
- 数组的索引、切片
- 多维数组的基本操作
1.数组的索引、切片
数组索引、切片主要有以下三个特点:
①数组索引从0开始
②可以反向索引
③可以对每一个维度都可以进行切片
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64'''数组下标从0开始,指的任意维度,下标都从0开始''' a = np.array([[1, 2], [5, 6]]) a ''' array([[1, 2], [5, 6]]) ''' print(a[0,0] ) # 访问a数组第0行第0列元素 1 a[0,0] =2 #修改a数组第0行第0列元素值为2 a ''' array([[2, 2], [5, 6]]) ''' '''数组下标支持反向索引,指任意维度最后元素-1,依次反向索引''' print(a[0,-1]) # 访问a数组第0行第-1(即正向索引第1列)元素 2 '''数组切片 数组切片方式与列表相同,即在某一维度上进行切片''' # 正态生成4行5列的二维数组 arr = np.random.normal(1.75, 0.1, (4, 5)) print(arr) ''' [[1.79298767 1.91415977 1.53111211 1.78351471 1.77301072] [1.64799994 1.96470888 1.74782748 1.75591085 1.65585861] [1.83204328 1.79612227 1.73520328 1.85348431 1.7278858 ] [1.90285654 1.85058937 1.62209023 1.5908711 1.71462305]] ''' # 截取第1至2行的第2至3列(从第0行算起)缺省默认全部留下 after_arr = arr[1:3, 2:4] print(after_arr) ''' [[1.74782748 1.75591085] [1.73520328 1.85348431]] ''' #截取第2列至第3列的所有行 after_arr = arr[:, 2:4] ''' array([[1.53111211, 1.78351471], [1.74782748, 1.75591085], [1.73520328, 1.85348431], [1.62209023, 1.5908711 ]]) ''' #截取第1行至第三行的所有列 after_arr = arr[1:3, ] ''' array([[1.64799994, 1.96470888, 1.74782748, 1.75591085, 1.65585861], [1.83204328, 1.79612227, 1.73520328, 1.85348431, 1.7278858 ]]) ''' #通过数组切片修改数组元素 a = np.array([[1, 2], [5, 6]]) a[0,:]=[1,1] # a 第0行修改为 [1,1] a ''' array([[1, 1], [5, 6]]) ''' a = np.array([[1, 2], [5, 6]]) a[:,1]=[2,2] # a 第1列修改为 [1,1] a ''' array([[1, 2], [5, 2]]) '''
2.多维数组的基本操作
将会介绍以下基本操作:
1.数组的数学运算(操作不同类型的多维数组时,结果自动转换为精度更高类型的数组):+、-、 /、 ** 、二元运算符、 * :元素点乘、矩阵乘法 dot
+、-、/、** :这几类操作是对数组中的元素进行直接的加、减、除、求幂操作,支持对整个数组或者部分数组元素进行操作
二元运算符:也是对数组中的元素进行直接的+=、-=、/=操作,并将结果赋值回原数组,支持对整个数组或部分数组元素进行操作
如:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53# 创建数组 a = np.array([[1, 2], [5, 6]]) ''' array([[1, 2], [5, 6]]) ''' a+3 #对数组a中的所有元素进行+3操作 ''' array([[4, 5], [8, 9]]) ''' a[0,0]+3 #对数组a的第0行第0列进行+3操作 ''' 4 ''' a*3 #对数组a中的所有元素进行*3操作 ''' array([[ 3, 6], [15, 18]]) ''' a/3 #对数组a中的所有元素进行/3操作 ''' array([[0.33333333, 0.66666667], [1.66666667, 2. ]]) ''' a ''' array([[1, 2], [5, 6]]) ''' a ** 2 #对数组a中的所有元素进行求幂操作 ''' array([[ 1, 4], [25, 36]], dtype=int32) ''' #二元运算符 a = np.array([[1, 2], [5, 6]])a+=3 a ''' array([[4, 5], [8, 9]]) ''' a[1,1]+=1 a ''' array([[ 4, 5], [ 8, 10]]) '''
元素点乘:*
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# 创建数组 a = np.array([[1, 2], [5, 6]]) # 多维数组 b = np.array([[1, 2], [5, 6]]) print(a) ''' [[1 2] [5 6]] ''' print(b) ''' [[1 2] [5 6]] ''' c = a * b #数组a与数组b进行元素点乘 print(c) ''' [[ 1 4] [25 36]] ''' #进行点乘的数组,维数信息需要可以进行元素内积,否则提示错误信息 b = np.array([[1, 2,1], [5, 6,7]]) a*b ''' Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operands could not be broadcast together with shapes (2,2) (2,3) '''
矩阵乘法 dot:
numpy官方文档上所写:
如果 a 和 b都是 1-D arrays,它的作用是计算内积。(不进行复共轭)
1
2np.dot(3, 4) # 12 np.dot([2, 3], [2, 3]) # 13
如果 a 和 b 是 2-D arrays, 作用是矩阵的乘积, a 和 b的维数要满足矩阵乘积维数要求,此时推荐使用 a @ b 。
1
2
3
4
5
6
7a = [[1, 0], [0, 1] b = [[4, 1], [2, 2]] np.dot(a, b) ''' array([[4, 1], [2, 2]]) '''
如果 a 或 b 是 0-D (标量), 等价于数组点乘,推荐使用 numpy.multiply(a, b)或 a * b。
1np.dot(2,3) # 6
如果 a 是 N-D array 且 b 是 1-D array, 作用是在a 和 b的最后一个轴上进行sum product运算。
1
2
3
4
5
6
7
8
9
10
11
12a = np.array([[[ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 9., 10., 11., 12.]], [[ 1., 2., 3., 4.], [ 5., 6., 7., 8.], [ 9., 10., 11., 12.]]]) b = np.array([1,2,3,4]) np.dot(a, b) ''' array([[ 30., 70., 110.], [ 30., 70., 110.]]) '''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 创建数组 a = np.array([[1, 2], [5, 6]]) # 多维数组 b = np.array([[1, 2], [5, 6]]) print(a) ''' [[1 2] [5 6]] ''' print(b) ''' [[1 2] [5 6]] ''' d = np.dot(a, b) #数组a与数组b进行矩阵乘法,最后的结果存入d中 print(d) ''' array([[11, 14], [35, 46]]) '''
2.转置
使用 numpy的transpose方法,完成数组转置
语法格式:numpy.transpose(array)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#一维数组转置 arr = np.arange(6) print(arr) ''' [0, 1, 2, 3, 4, 5] ''' print(np.transpose(arr)) ''' [0, 1, 2, 3, 4, 5]#一维还是一维… ''' #二维数组转置 arr = np.arange(6).reshape((2,3)) print(arr) ''' [[0, 1, 2], [3, 4, 5]] ''' print(np.transpose(arr)) ''' [[0,3], [1,4], [3,5]] '''
3.条件运算
对数组中的元素进行条件运算,输出元素相应的bool数组,可以用于筛选数组元素,对指定范围数组元素进行修改等。
如:将数组中大于0.5的值置为0
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53arr = np.random.rand(5,5) # 5x5的随机数组 arr ''' array([[0.10158289, 0.24435586, 0.63083734, 0.97459745, 0.64882868], [0.43441076, 0.92342304, 0.05077939, 0.3391776 , 0.50852469], [0.08768648, 0.57992711, 0.83834858, 0.97962452, 0.55448346], [0.42689988, 0.36140115, 0.77588118, 0.36685161, 0.83965068], [0.70111686, 0.18487657, 0.2525437 , 0.86080893, 0.69806511]]) ''' mask = arr>0.5 # 生成数组中元素大于0.5的元素的bool数组 ''' array([[False, False, True, True, True], [False, True, False, False, True], [False, True, True, True, True], [False, False, True, False, True], [ True, False, False, True, True]]) ''' arr[mask] = 0 # 将数组中大于0.5的值设为0 ''' array([[0.10158289, 0.24435586, 0. , 0. , 0. ], [0.43441076, 0. , 0.05077939, 0.3391776 , 0. ], [0.08768648, 0. , 0. , 0. , 0. ], [0.42689988, 0.36140115, 0. , 0.36685161, 0. ], [0. , 0.18487657, 0.2525437 , 0. , 0. ]]) '''
最后
以上就是体贴滑板最近收集整理的关于python机器学习之九 numpy库之数组(数组的索引、切片;多维数组的基本操作)的全部内容,更多相关python机器学习之九内容请搜索靠谱客的其他文章。
发表评论 取消回复