整数索引和切片的基本使用
ndarray对象支持索引和切片操作,且提供了比常规Python序列更多的索引功能,除了使用整数进行索引以外,还可以使用整数数组和布尔数组进行索引。
ndarray对象的元素可以通过索引和切片来访问和修改,就像Python内置的容器对象一样。下面是一个一维数组,从表面上来看,该数组使用索引和切片的方式,与Python列表的功能相差不大,具体代码如下。
In [53]: import numpy as np
In [54]: arr = np.arange(8) # 创建一个一维数组
In [55]: arr
Out[55]: array([0, 1, 2, 3, 4, 5, 6, 7])
In [56]: arr[5] # 获取索引为5的元素
Out[56]: 5
In [57]: arr[3:5] # 获取索引为3~5的元素,但不包括5
Out[57]: array([3, 4])
In [58]: arr[1:6:2] # 获取索引为1~6的元素,步长为2
Out[58]: array([1, 3, 5])
不过,对于多维数组来说,索引和切片的使用方式与列表就大不一样了。在二维数组中,每个索引位置上的元素不再是一个标量了,而是一个一维数组,具体示例代码如下。
In [59]: import numpy as np
In [60]: arr2d = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) # 创建二维数组
In [61]: arr2d
Out[61]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [62]: arr2d[1] # 获取索引为1的元素
Out[62]: array([4, 5, 6])
此时,如果我们想通过索引的方式来获取二维数组的单个元素,就需要通过形如“arr[x,y]”,以逗号分隔的索引来实现。其中,x表示行号,y表示列号。示例代码如下:
In [63]: arr2d[0, 1] # 获取位于第0行第1列的元素
Out[63]: 2
接下来,通过一张图来描述数组arr2d的索引方式,如图1所示。
图1 arr2d的索引方式
从图1中可以看出,arr2d是一个3行3列的数组,如果我们想获取数组的单个元素,必须同时指定这个元素的行索引和列索引。例如,获取索引位置为第1行第1列的元素,我们可以通过arr2d[1,1]来实现。
相比一维数组,多维数组的切片方式花样更多,多维数组的切片是沿着行或列的方向选取元素的,我们可以传入一个切片,也可以传入多个切片,还可以将切片与整数索引混合使用。
传入一个切片的示例代码:
In [64]: arr2d[:2]
Out[64]:
array([[1, 2, 3],
[4, 5, 6]])
传入两个切片的示例代码:
In [65]: arr2d[0:2, 0:2]
Out[65]:
array([[1, 2],
[4, 5]])
切片与整数索引混合使用的示例代码:
In [66]: arr2d[1, :2]
Out[66]: array([4, 5])
上述多维数组切片操作的相关示意图,如图2所示。
图2 多维数组切片图示