首页Python【Python数据分析】5...

【Python数据分析】5.数组的索引与切片


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接: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([98765])
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(33)
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(223)
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([98765])
5>>> arr[1:4:2]
6array([86])

  • 多维数组的切片:

当每个维度都给定一个切片,以逗号分隔,那么得到的切片结果维度与原数组相同。

 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(33)
9>>> arr_2d[1: , :2]
10array([[6, 5],
11       [3, 2]]
)
12>>> arr_2d[1: , :2].shape
13(22)
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(233)
28>>> arr_3d[1: ,:2 ,2:]
29array([[[7],
30        [4]]
])
31>>> arr_3d[1: ,:2 ,2:].shape
32(121)

  • 如果将索引和切片混合使用,可以得到低维度的切片:
 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(33)
9>>> arr_2d[1: , 2]
10array([41])
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(233)
27>>> arr_3d[1: ,:2 ,2]
28array([[7, 4]])
29>>> arr_3d[1: ,:2 ,2].shape
30(12)

TIPS:数组切片是原始数组的视图。这意味着数据不会被复制,对视图的任何修改都会反映在源数组上。之所以这样设计是因为NumPy被设计成能够处理非常大的数组,如果NumPy操作总是复制数据,会导致性能和内存问题。如果你需要数组的切片拷贝而不是一个视图时,需要使用copy()方法显式地复制。

 1# 二维数组
2>>> arr = np.arange(10)
3>>> arr
4array([0123456789])
5
6>>> arr[::2]
7array([02468])
8
9>>> arr[::2] = 99
10>>> arr
11array([99,  199,  399,  599,  799,  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(63)
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(63)
12
13# 传递多个数组
14>>> arr[[0,2,4,5] , [0,1,0,1]]
15array([1811,  6,  2])
16
17# 根据每个索引元祖对应的元素选出一个一维数组进行索引
18>>> arr[0,0] , arr[2,1] , arr[4,0] , arr[5,1]
19(181162)


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments