1、整数索引和切片
NumPy中可以通过整数索引和切片来访问和修改数组中的元素,数组的维度不同、整数索引和切片的用法也会有所不同。 对于一维数组来说,整数索引和切片的用法与Python列表中索引和切片的用法相同;对于二维数组来说,整数索引和切片的用法要复杂一些。下面以二维数组为例,演示如何使用整数索引和切片访问数组的元素。
(1)如果希望获取二维数组的一行元素,则可以通过“数组[行索引]”的形式实现,示例代码如下 :
python">
>>> import numpy as np
>>> arr2d=np.array([[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24], [5,10,15,20,25]])
>>> arr2d
array([[ 1, 6, 11, 16, 21],[ 2, 7, 12, 17, 22],[ 3, 8, 13, 18, 23],[ 4, 9, 14, 19, 24],[ 5, 10, 15, 20, 25]])
>>> arr2d[2] #共获取行索引为2的整行元素
输出:array([ 3, 8, 13, 18, 23])
(2)如果希望获取二维数组的单个元素,则需要通过“数组[行索引,列索引]”的形式实现。 例如,获取位于第3行第4列的元素,示例代码如下:
python">
>>> arr2d[2,3] #获取行索引为2、列索引为3的元素
输出:18
(3)如果希望获取二维数组的多行元素,则可以通过“数组[行索引的切片]”的形式实现,示例代码如下 :
python">
>>> arr2d[:2] #获取索引为0、1的两行元素,截止到2且不包含2
输出:array([[ 1, 6, 11, 16, 21],[ 2, 7, 12, 17, 22]])
(4)如果希望获取二维数组的部分元素,则可以通过“数组[行索引的切片,列索引的切片]” 的形式实现,示例代码如下:
python">
>>> arr2d[:2,:2] #获取行索引为0~1、列索引为0~1的部分元素,
输出:array([[1, 6],[2, 7]])
(5)此外,也可以混合使用切片与整数索引,通过这种方式访问二维数组的部分元素,示例代码如下:
python">>>> arr2d[:,2] #获取列索引为2的整列元素,此时行不限制
输出:array([11, 12, 13, 14, 15])
2、花式索引
花式索引是NumPy的一个术语,是指用整数数组或整数列表作为索引。若花式索引操作的目标对象是一维数组,则会把花式索引的每个整数作为索引,通过索引获取相应位置的元素;若花式索引操作的目标对象是二维数组,则通过花式索引获取的结果是一行或多行元素。
通俗理解:花式索引就像是给数组里的元素排队,然后用一个特殊的名单(整数数组或列表)来挑选出你想要的那些元素。如果数组是一排人的话,花式索引就像是按照名单顺序点名字,点到谁,谁就出列。对于一维数组来说,就像是直接点一个人的名字;而对于二维数组,则像是点了一群人的名字,可能是整排的人,也可能是从不同排里挑出的人。简单来说,花式索引就是按照你的名单,从数组中精确地取出你想要的元素。
接下来以一维数组为例,演示如何使用花式索引访问一维数组的部分元素,具体代码如下:
python">
>>> arr=np.array([10,6,5,11,18,16,9,0,3,20])
>>> arr[[0,1,5]]
输出:array([10, 6, 16])
上述代码中,通过花式索引[0,1,5]访问一维数组arr,分别获取索引0、1、5对应的元素。 从上述结果中可以看出,程序输出了一个新数组,该数组中的元素是10、6、16。
下面二维数组arr2d为例,演示如何使用花式索引访问二维数组的元素, 具体代码如下:
python">
>>> arr2d[[1,4]]
输出:array([[ 2, 7, 12, 17, 22],[ 5, 10, 15, 20, 25]])
上述代码中,通过花式索引[1,4]访问二维数组arr2d,依次从二维数组arr2d中获取行索引1、 4对应的元素。从上述结果可以看出,程序输出了二维数组中行索引为1、4对应的两行元素。
如果想要访问二维数组中的部分元素,而不是整行元素,则需要通过两个花式索引完成, 其中第一个花式索引中的整数会被作为行索引,第二个花式索引中的整数会被作为列索引。
当使用两个花式索引操作二维数组时,会按照二维数组的索引方式,依次获取位置相同的行索引和列索引对应的元素,示例代码如下:
python">
>>> arr2d[[1,4],[2,3]]
输出:array([12, 20])
上述代码中,通过两个花式索引[1,4]、[2,3]访问二维数组arr2d,依次从二维数组arr2d中获取行索引1、列索引2对应的元素和行索引4、列索引3对应的元素。
需要注意的是,当使用两个花式索引访问二维数组时,两个花式索引对应数组或列表的长度是相等的,并且长度不能超过二维数组中相应轴上的元素数量,否则会出现索引异常。
3、步尔索引
布尔索引指的是将一个布尔数组或布尔列表作为数组索引。当使用布尔索引访问数组时,会将数组中与布尔数组或布尔列表位置相同的元素进行匹配,并返回与布尔数组或布尔列表中True位置对应的元素。注意,布尔数组或布尔列表的长度必须与被索引轴的长度一致。
值得一提的是,布尔数组可以是手动创建的,也可以是数组与某个数通过比较运算符或逻辑运算符进行运算后的结果。
假设现在有一个存储了学生数学成绩的数组,若我们需要筛选出分数大于80的语文成绩,则可以先通过比较运算符得到数组与80进行运算后生成的一个布尔数组,再把布尔数组作为布尔索引,只要布尔值为True,就获取True对应位置的元素,示例代码如下:
python">>>> student_score =np.array([[79,88,80],[89,90,92],[83,78,85],[78,76,80]])
>>> student_score
array([[79, 88, 80],[89, 90, 92],[83, 78, 85],[78, 76, 80]])
>>> student_score>80
array([[False, True, False],[ True, True, True],[ True, False, True],[False, False, False]])
>>> student_score[student_score>80]
array([88, 89, 90, 92, 83, 85])
从上述结果中可以看出,程序返回了一个一维数组,该数组中每个元素的值都大于80,说明成功筛选出了分数大于80的数学成绩。
此外,还可以将布尔索引与切片混合使用,示例代码如下:
python">
>>> student_score[[True,False,True,False],:2]
array([[79, 88],[83, 78]])
在上述代码中,通过布尔索引[True,False,True,False]会获取数组中True对应的一行数据,也就是行索引为0、2的两行数据,通过切片会获取两行数据中列索引为0、1的元素。