本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis
根据《Python for Data Analysis 3rd Edition》翻译整理
—————-————————————-
1.基础索引与切片:
索引:获取数组中特定位置元素的过程;
切片:获取数组元素子集的过程。
1.1 基础索引:
-
一维数组的索引:与python的列表类似
1>>> arr = np.array([9,8,7,6,5])
2>>> arr
3array([9, 8, 7, 6, 5])
4
5>>> arr[2]
67
-
多维数组的索引:每个维度一个索引值,以逗号分隔
1# 二维数组
2>>> arr_2d = np.array([[9,8,7] , [6,5,4] , [3,2,1]])
3>>> arr_2d
4array([[9, 8, 7],
5 [6, 5, 4],
6 [3, 2, 1]])
7
8# 查看数组的形状尺度
9>>> arr_2d.shape
10(3, 3)
11
12# 在第一个维度上获取第2个,在第二个维度上获取第3个
13>>> arr_2d[1,2]
144
15
16# 三维数组
17>>> arr_3d = np.array([[[12,11,10] , [9,8,7]] , [[6,5,4] , [3,2,1]]])
18>>> arr_3d
19array([[[12, 11, 10],
20 [ 9, 8, 7]],
21
22 [[ 6, 5, 4],
23 [ 3, 2, 1]]])
24
25>>> arr_3d.shape
26(2, 2, 3)
27>>> arr_3d[1,0,2]
284
29>>> arr_3d[1][0][2]
304
在多维数组的索引中,每个索引值对应的是一个一维或者多维数组。
因此,单个元素的获取也可以通过递归的方式获得。
1# 单个元素的获取也可以通过递归的方式获得
2>>> arr_2d[1][2]
34
4>>> arr_2d[-1,-2] , arr_2d[-1][-2]
5(2, 2)
6>>> arr_3d[1][0][2]
74
8>>> arr_3d[-1,-1,-2] , arr_3d[-1][-1][-2]
9(2, 2)
1.2 基础切片:
-
一维数组的切片:与python的列表类似:
1# 二维数组
2>>> arr = np.array([9,8,7,6,5])
3>>> arr
4array([9, 8, 7, 6, 5])
5>>> arr[1:4:2]
6array([8, 6])
-
多维数组的切片:
当每个维度都给定一个切片,以逗号分隔,那么得到的切片结果维度与原数组相同。
1# 二维数组
2>>> arr_2d = np.array([[9,8,7] , [6,5,4] , [3,2,1]])
3>>> arr_2d
4array([[9, 8, 7],
5 [6, 5, 4],
6 [3, 2, 1]])
7>>> arr_2d.shape
8(3, 3)
9>>> arr_2d[1: , :2]
10array([[6, 5],
11 [3, 2]])
12>>> arr_2d[1: , :2].shape
13(2, 2)
14
15
16# 三维数组
17>>> arr_3d = np.array([[[18,17,16] , [15,14,13] , [12,11,10]] , [[9,8,7] , [6,5,4] , [3,2,1]]])
18>>> arr_3d
19array([[[18, 17, 16],
20 [15, 14, 13],
21 [12, 11, 10]],
22
23 [[ 9, 8, 7],
24 [ 6, 5, 4],
25 [ 3, 2, 1]]])
26>>> arr_3d.shape
27(2, 3, 3)
28>>> arr_3d[1: ,:2 ,2:]
29array([[[7],
30 [4]]])
31>>> arr_3d[1: ,:2 ,2:].shape
32(1, 2, 1)
-
如果将索引和切片混合使用,可以得到低维度的切片:
1# 二维数组
2>>> arr_2d = np.array([[9,8,7] , [6,5,4] , [3,2,1]])
3>>> arr_2d
4array([[9, 8, 7],
5 [6, 5, 4],
6 [3, 2, 1]])
7>>> arr_2d.shape
8(3, 3)
9>>> arr_2d[1: , 2]
10array([4, 1])
11>>> arr_2d[1: , 2].shape
12(2,)
13
14
15# 三维数组
16>>> arr_3d = np.array([[[18,17,16] , [15,14,13] , [12,11,10]] , [[9,8,7] , [6,5,4] , [3,2,1]]])
17>>> arr_3d
18array([[[18, 17, 16],
19 [15, 14, 13],
20 [12, 11, 10]],
21
22 [[ 9, 8, 7],
23 [ 6, 5, 4],
24 [ 3, 2, 1]]])
25>>> arr_3d.shape
26(2, 3, 3)
27>>> arr_3d[1: ,:2 ,2]
28array([[7, 4]])
29>>> arr_3d[1: ,:2 ,2].shape
30(1, 2)
TIPS:数组切片是原始数组的视图。这意味着数据不会被复制,对视图的任何修改都会反映在源数组上。之所以这样设计是因为NumPy被设计成能够处理非常大的数组,如果NumPy操作总是复制数据,会导致性能和内存问题。如果你需要数组的切片拷贝而不是一个视图时,需要使用copy()方法显式地复制。
1# 二维数组
2>>> arr = np.arange(10)
3>>> arr
4array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
5
6>>> arr[::2]
7array([0, 2, 4, 6, 8])
8
9>>> arr[::2] = 99
10>>> arr
11array([99, 1, 99, 3, 99, 5, 99, 7, 99, 9])
2.布尔索引:
例如,假设需要将数组中的所有负数统一赋值为0。
那么就可以通过布尔索引得到一个布尔数组,该数组在负值的位置为False,然后通过赋值操作完成需求。
1>>> arr = np.array([[[18,17,-16] , [15,-14,13] , [12,-11,-10]] , [[9,-8,7] , [6,5,-4] , [3,-2,1]]])
2>>> arr
3array([[[ 18, 17, -16],
4 [ 15, -14, 13],
5 [ 12, -11, -10]],
6
7 [[ 9, -8, 7],
8 [ 6, 5, -4],
9 [ 3, -2, 1]]])
10
11>>> arr < 0
12array([[[False, False, True],
13 [False, True, False],
14 [False, True, True]],
15
16 [[False, True, False],
17 [False, False, True],
18 [False, True, False]]])
19
20>>> arr[arr < 0]
21array([-16, -14, -11, -10, -8, -4, -2])
22
23>>> arr[arr < 0] = 0
24>>> arr
25array([[[18, 17, 0],
26 [15, 0, 13],
27 [12, 0, 0]],
28
29 [[ 9, 0, 7],
30 [ 6, 5, 0],
31 [ 3, 0, 1]]])
3.神奇索引(花式索引):
神奇索引是Numpy中的术语,是指使用整数数组进行数据索引的操作。
例如,为了选择一个符合特定顺序的子集,可以通过传递一个包含指明所需顺序的列表或数组来实现(也可以使用负索引)。
1>>> arr = np.array([[18,17,16] , [15,14,13] , [12,11,10] , [9,8,7] , [6,5,4] , [3,2,1]])
2>>> arr
3array([[18, 17, 16],
4 [15, 14, 13],
5 [12, 11, 10],
6 [ 9, 8, 7],
7 [ 6, 5, 4],
8 [ 3, 2, 1]])
9
10>>> arr.shape
11(6, 3)
12
13# 传递一个包含指明所需顺序的列表或数组
14>>> arr[[0,2,4,5]]
15array([[18, 17, 16],
16 [12, 11, 10],
17 [ 6, 5, 4],
18 [ 3, 2, 1]])
19
20# 传递一个包含指明所需顺序的列表或数组——负索引
21>>> arr[[-6,-4,-2,-1]]
22array([[18, 17, 16],
23 [12, 11, 10],
24 [ 6, 5, 4],
25 [ 3, 2, 1]])
当传递多个索引数组时,会根据每个索引元祖对应的元素选出一个一维数组进行索引。
下面的操作就是选择了(0,0)、(2,1)、(4,0)和(5,1)这些元素。用有多少个轴的整数数组进行花式索引,其结果总是一维的。
1>>> arr = np.array([[18,17,16] , [15,14,13] , [12,11,10] , [9,8,7] , [6,5,4] , [3,2,1]])
2>>> arr
3array([[18, 17, 16],
4 [15, 14, 13],
5 [12, 11, 10],
6 [ 9, 8, 7],
7 [ 6, 5, 4],
8 [ 3, 2, 1]])
9
10>>> arr.shape
11(6, 3)
12
13# 传递多个数组
14>>> arr[[0,2,4,5] , [0,1,0,1]]
15array([18, 11, 6, 2])
16
17# 根据每个索引元祖对应的元素选出一个一维数组进行索引
18>>> arr[0,0] , arr[2,1] , arr[4,0] , arr[5,1]
19(18, 11, 6, 2)
本篇文章来源于微信公众号: 码农设计师