NumPy数组的布尔索引是指用一个由布尔值组成的数组来作为索引,此布尔数组的长度必须跟被索引的轴的长度一致。布尔值为True对应的元素被保留,为False对应的元素被舍弃。
布尔数组可以是布尔值组成布尔列表,也可以是数组的矢量运算生成的布尔数组。
>>> import numpy as np
>>> ar1=np.arange(6)
>>> ar1
array([0, 1, 2, 3, 4, 5])
# 创建一个布尔值组成的列表
>>> ar2=[True,False,True,False,True,False]
# 布尔值列表作为索引
>>> ar1[ar2]
array([0, 2, 4])
# 数组矢量运算使得每个元素都参与运算,而不需要循环
>>> ar3=ar1%2==0 # 判断数组每个元素是否为偶数
>>> ar3
array([ True, False, True, False, True, False])
# 布尔索引:用相同长度的布尔数组进行索引
# 获取索引为True的对应元素
>>> ar1[ar3]
array([0, 2, 4])
# 等价写法: arr[arr的布尔运算]
>>> ar1[ar1%2==0]
array([0, 2, 4])
# 创建一个二维数组
>>> ar2d=np.array([[1,2,3,4,5],[6,7,8,9,10]])
>>> ar2d
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
>>> ar2d%2==1
array([[ True, False, True, False, True],
[False, True, False, True, False]])
>>> ar2d[ar2d%2==1]
array([1, 3, 5, 7, 9])
>>> ar2d[0]%2==1
array([ True, False, True, False, True])
>>> ar2d[:,ar2d[0]%2==1]
array([[ 1, 3, 5],
[ 6, 8, 10]])
布尔索引支持关系运算、逻辑运算等,并且可以对布尔索引获取的数组元素进行修改。
>>> import numpy as np
>>> ar1=np.arange(6)
>>> ar1
array([0, 1, 2, 3, 4, 5])
# 关系运算 不等于
>>> ar1[ar1!=0]
array([1, 2, 3, 4, 5])
# 关系运算 大于
>>> con=ar1>3
>>> ar1[con]
array([4, 5])
# ~ 逻辑运算 非
>>> ar1[~con]
array([0, 1, 2, 3])
# | 逻辑运算 或,不能用 or
>>> conor=(ar1==2)|(ar1==5)
>>> conor
array([False, False, True, False, False, True])
>>> ar1[conor]
array([2, 5])
>>> ar1[(ar1==2)|(ar1==5)]
array([2, 5])
# & 逻辑运算 与,不能用 or
>>> conand=(ar1>2)&(ar1%2==1)
>>> conand
array([False, False, False, True, False, True])
>>> ar1[conand]
array([3, 5])
# 布尔索引的赋值运算
>>> ar1[ar1%2==0]=99
>>> ar1
array([99, 1, 99, 3, 99, 5])