使用布尔索引可以避免使用for循环来操作数组,效率还是蛮高的,大家有必要了解下。
一般二维数组在实际工作中使用较多,所以本文直接以二维数组为例。
注:所涉及numpy基础背景知识我们在这里不再赘述,请自行百度。
首先构建一个4行6列数组arr_1,示例如下图:
我们的目标是根据第5列的元素的值,遮盖元素为1的行(第2行和第4行),从而从中取得元素为0的行(第1行和第3行)。
先将第5列切片,使用逻辑运算制成布尔索引,再用布尔索引遮盖arr_1,得到我们想要的结果arr_2数组。
下面是代码示例:
bool_0=arr_1[:,4]#切片取出第5列,冒号代表取整列
bool_1=[bool_0!=1]#通过比较运算得到布尔索引(其类型为list)
arr_2=arr_1[tuple(bool_1)]#将list转化为tuple进行布尔索引
其中bool_1的值为[true,false,true,false]
另外一点需要说明的是,布尔索引应从list类型转换为tuple,否则有警告:FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use arr[tuple(seq)]
instead of arr[seq]
. In the future this will be interpreted as an array index, arr[np.array(seq)]
, which will result either in an error or a different result.
该警告虽然不影响最终结果,但未来可能会导致问题,所以最好还是转换一下。
最后我们得到的数组arr_2为:
【发表是最好的记忆】