You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pqxin6emf/Part1/Chapter2/2.2 NumPy进阶/2.2.2 花式索引与布尔索引.md

2.8 KiB

2.2.2:花式索引与布尔索引

花式索引

花式索引(Fancy Indexing)是 NumPy 用来描述使用整型数组(这里的数组,可以是 NumPy 的 ndarray ,也可以是 python 的 list)作为索引。

Fancy Indexing 的意义是根据索引数组的值作为被索引数组( ndarray )的某个轴的下标来取值。对于使用一维整型数组作为索引来说,如果被索引数组( ndarray )是一维数组,那么索引的结果就是对应位置的元素;如果被索引数组( ndarray )是二维数组,那么就是对应下标的行。如下图所示:

花式索引示意图

示例代码如下:

import numpy as np

arr = np.array(['zero','one','two','three','four'])

'''
打印arr中索引为1和4的元素
结果为:['one', 'four']
'''
print(arr[[1,4]])

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

'''
打印arr中索引为1和0的行
结果为:[[4, 5, 6],
		[1, 2, 3]]
'''
print(arr[[1, 0]])

'''
打印arr中第2行第1列与第3行第2列的元素
结果为:[4, 8]
'''
print(arr[[1, 2], [0, 1]])

输出如下:

['one' 'four']
[[4 5 6]
 [1 2 3]]
[4 8]

布尔索引

我们可以通过一个布尔数组来索引目标数组,以此找出与布尔数组中值为 True 的对应的目标数组中的数据,从而达到筛选出想要的数据的功能。如下图所示:(PS需要注意的是布尔数组的长度必须与被索引数组对应的轴的长度一致)

布尔索引示意图

不过单纯的传入布尔数组进去有点蠢,有没有更加优雅的方式来使用布尔索引来达到筛选数据的效果呢?当然有!我们可以想办法根据我们的需求,构造出布尔数组,然后再通过布尔索引实现筛选数据的功能。

假设有公司员工绩效指数的数据如下(用一个一维的 ndarray 表示),现在想要把绩效指数大于 3.5 的筛选出来进行股权激励。

公司员工绩效指数数据

那首先就要构造出布尔数组,构造布尔数组很简单,performance > 3.5即可。此时会生成想要的布尔数组。

布尔索引结果

有了布尔数组就可以使用布尔索引来实现筛选数据的功能了。

筛选过程示意图

示例代码如下:

import numpy as np

performance = np.array([3.25, 3.5, 3.75, 3.5, 3.25, 3.75])

'''
筛选出绩效高于3.5的数据
结果为:[3.75, 3.75]
'''
print(performance[performance > 3.5])

'''
筛选出绩效高于3.25并且低于4的数据
注意:&表示并且的意思可以看成是and。&左右两边必须加上()
结果为:[3.5  3.75 3.5  3.75]
'''
print(performance[(performance > 3.25) & (performance < 4)])

输出如下:

[3.75 3.75]
[3.5  3.75 3.5  3.75]