Jupyter中numpy布尔数组索引返回空数组的原因是什么?
问题原因与运行逻辑解释
核心错误点
你误将需要传入的布尔掩码数组拆成了多个逗号分隔的独立布尔值,numpy将其识别为多轴索引而非单轴的元素筛选规则,才得到了空数组。
具体运行逻辑
- 你创建的数组
a = np.arange(5)是一维数组,shape为(5,),仅存在1个维度。 - 你写的索引代码
a[True, True, False, False, False]中,逗号分隔的每个值会被numpy判定为对应维度的索引:你传了5个值,numpy会自动将a的维度临时提升到5维,在原维度前新增4个长度为1的轴,临时shape变为(1,1,1,1,5)。 - 布尔值作为索引时会自动转换为整数:
True对应1,False对应0,因此5个维度的索引分别为1、1、0、0、0。 - 前两个新增轴的长度均为1,合法索引只有0,取索引1属于越界访问,会返回空结果,因此最终打印的
b是空数组。
正确写法
如果要通过布尔掩码筛选一维数组的元素,需要将所有布尔值放在列表或numpy数组中,作为单轴的索引参数传入:
import numpy as np a = np.arange(5) b = a[[True, True, False, False, False]] print(b)
运行输出为:
[0 1]
符合你筛选前两个元素的预期。
内容的提问来源于stack exchange,提问作者Aparna
相关产品推荐
相关产品推荐

