np.take函数对布尔数组的行为探究及与布尔索引的差异
np.take处理布尔数组的逻辑及示例解析
核心处理规则
np.take对布尔类型索引的实际处理逻辑可总结为:
- 当传入布尔数组作为
indices参数时,会自动将布尔值转换为整数索引:False映射为0,True映射为1。 - 转换完成后,按照np.take的默认行为(未指定
axis时),直接用转换后的整数索引数组逐个位置提取原数组元素,最终结果的形状与输入的布尔索引数组完全一致。
示例解析
给定输入:
a = np.array([2, 3]) b = np.array([[False, True], [ True, False], [False, True], [ True, False]])
布尔数组b会被转换为整数索引数组:
[[0, 1], [1, 0], [0, 1], [1, 0]]
随后对每个索引值提取a中对应元素:0对应a[0]=2,1对应a[1]=3,因此生成输出:
array([[2, 3], [3, 2], [2, 3], [3, 2]])
这就是示例中列元素交替切换的原因。
直接布尔索引报错的原因
直接使用a[b]属于numpy原生布尔索引机制,要求布尔数组的维度必须与原数组维度兼容(要么维度完全匹配,要么可广播至原数组维度)。这里a是1维数组(形状(2,)),而b是2维数组(形状(4,2)),无法满足维度兼容要求,因此抛出IndexError: too many indices for array。
内容的提问来源于stack exchange,提问作者Karl Gardner
相关产品推荐
相关产品推荐

