# 2.2.2:花式索引与布尔索引 ## 花式索引 花式索引(Fancy Indexing)是 NumPy 用来描述使用整型数组(**这里的数组,可以是 NumPy 的 ndarray ,也可以是 python 的 list**)作为索引。 Fancy Indexing 的意义是根据索引数组的值作为被索引数组( ndarray )的某个轴的下标来取值。对于使用一维整型数组作为索引来说,如果被索引数组( ndarray )是一维数组,那么索引的结果就是对应位置的元素;如果被索引数组( ndarray )是二维数组,那么就是对应下标的行。如下图所示: ![花式索引示意图](1.jpg) 示例代码如下: ```python 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]]) ``` 输出如下: ```python ['one' 'four'] [[4 5 6] [1 2 3]] [4 8] ``` ## 布尔索引 我们可以通过一个布尔数组来索引目标数组,以此找出与布尔数组中值为 True 的对应的目标数组中的数据,从而达到筛选出想要的数据的功能。如下图所示:(**PS:需要注意的是,布尔数组的长度必须与被索引数组对应的轴的长度一致**) ![布尔索引示意图](2.jpg) 不过单纯的传入布尔数组进去有点蠢,有没有更加优雅的方式来使用布尔索引来达到筛选数据的效果呢?当然有!我们可以想办法根据我们的需求,构造出布尔数组,然后再通过布尔索引实现筛选数据的功能。 假设有公司员工绩效指数的数据如下(用一个一维的 ndarray 表示),现在想要把绩效指数大于 3.5 的筛选出来进行股权激励。 ![公司员工绩效指数数据](3.jpg) 那首先就要构造出布尔数组,构造布尔数组很简单,`performance > 3.5`即可。此时会生成想要的布尔数组。 ![布尔索引结果](4.jpg) 有了布尔数组就可以使用布尔索引来实现筛选数据的功能了。 ![筛选过程示意图](5.jpg) 示例代码如下: ```python 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)]) ``` 输出如下: ```python [3.75 3.75] [3.5 3.75 3.5 3.75] ```