# 2.1.5:索引与切片 ## 索引 ndarray 的索引其实和 python 的 list 的索引极为相似。元素的索引从 0 开始。代码如下: ```python import numpy as np # a中有4个元素,那么这些元素的索引分别为0,1,2,3 a = np.array([2, 15, 3, 7]) # 打印第2个元素 # 索引1表示的是a中的第2个元素 # 结果为15 print(a[1]) # b是个2行3列的二维数组 b = np.array([[1, 2, 3], [4, 5, 6]]) # 打印b中的第1行 # 总共就2行,所以行的索引分别为0,1 # 结果为[1, 2, 3] print(b[0]) # 打印b中的第2行第2列的元素 # 结果为5 print(b[1][1]) ``` 输出如下: ```python 15 [1 2 3] 5 ``` ## 遍历 ndarray 的遍历方式与 python 的 list 的遍历方式也极为相似,示例代码如下: ```python import numpy as np a = np.array([2, 15, 3, 7]) # 使用for循环将a中的元素取出来后打印 for element in a: print(element) # 根据索引遍历a中的元素并打印 for idx in range(len(a)): print(a[idx]) # b是个2行3列的二维数组 b = np.array([[1, 2, 3], [4, 5, 6]]) # 将b展成一维数组后遍历并打印 for element in b.flat: print(element) # 根据索引遍历b中的元素并打印 for i in range(len(b)): for j in range(len(b[0])): print(b[i][j]) ``` 输出如下: ```python 2 15 3 7 2 15 3 7 1 2 3 4 5 6 1 2 3 4 5 6 ``` ## 切片 ndarray 的切片方式与 python 的 list 的遍历方式也极为相似,对切片不熟的同学也不用慌,套路很简单,就是用索引。 假设想要将下图中紫色部分切片出来,就需要确定行的范围和列的范围。由于紫色部分行的范围是 0 到 2 ,所以切片时行的索引范围是 0:3 (**索引范围是左闭右开**);又由于紫色部分列的范围也是 0 到 2 ,所以切片时列的索引范围也是 0:3 (**索引范围是左闭右开**)。最后把行和列的索引范围整合起来就是 [0:3, 0:3] (**逗号左边是行的索引范围**)。当然有时为了方便,0 可以省略,也就是 [:3, :3] 。 ![切片示意图](5.jpg) 切片示例代码如下: ```python import numpy as np # a中有4个元素,那么这些元素的索引分别为0,1,2,3 a = np.array([2, 15, 3, 7]) ''' 将索引从1开始到最后的所有元素切片出来并打印 结果为[15 3 7] ''' print(a[1:]) ''' 将从倒数第2个开始到最后的所有元素切片出来并打印 结果为[3 7] ''' print(a[-2:]) ''' 将所有元素倒序切片并打印 结果为[ 7 3 15 2] ''' print(a[::-1]) # b是个2行3列的二维数组 b = np.array([[1, 2, 3], [4, 5, 6]]) ''' 将第2行的第2列到第3列的所有元素切片并打印 结果为[[5 6]] ''' print(b[1:, 1:3]) ''' 将第2列到第3列的所有元素切片并打印 结果为[[2 3] [5 6]] ''' print(b[:, 1:3]) ``` 输出如下: ```python [15 3 7] [3 7] [7 3 15 2] [[5 6]] [[2 3] [5 6]] ```