仅传入单个二维布尔数组时np.where的运行逻辑与应用场景疑问
np.where单布尔参数用法说明
核心运行逻辑
当np.where()仅传入1个布尔类型的数组作为参数时,功能是返回数组中所有值为True的元素的坐标索引:
- 返回结果是一个长度和输入数组维度一致的元组,元组的第i个元素是所有符合条件的元素在第i维度上的索引组成的一维数组
- 索引的输出顺序默认按行优先(C语言顺序)排列
对应你给出的示例做验证:
第一个示例的输入数组为3行3列的二维布尔数组:
z = [[True, False, True], [True, True, True], [False, False, False]]
按行优先遍历,所有值为True的元素坐标依次是(0,0)、(0,2)、(1,0)、(1,1)、(1,2),因此返回的行坐标数组为[0 0 1 1 1],列坐标数组为[0 2 0 1 2],和你得到的输出完全一致。
另外两个修改后的示例也符合该逻辑:
- 修改为2行3列数组
[[True, False, True],[True, True, True]]时,原3行版本的第三行全为False,没有符合条件的元素,因此返回结果和3行版本一致 - 修改为2行2列数组
[[True, False],[True, True]]时,符合条件的坐标依次是(0,0)、(1,0)、(1,1),因此返回行坐标[0 1 1]、列坐标[0 0 1],和输出匹配
常见应用场景
- 掩码类图像处理:比如语义分割、文本生成场景中,快速提取指定类别区域、文本有效区域的所有像素坐标,用于后续的区域裁剪、特征统计、标注绘制等操作,你提到的SynthText仓库中就是用该方法定位可放置文本的有效区域。
- 数值数组条件筛选:对数值数组做阈值判断得到布尔掩码后,可直接用该方法取出所有符合阈值条件的元素位置,也可直接配合索引取值,比如
arr[np.where(arr > 10)]即可快速取出数组中所有大于10的元素,执行效率远高于手写循环遍历。 - 稀疏数据处理:快速提取稀疏矩阵、稀疏采样数据中的非零/有效元素坐标,用于稀疏结构存储、数据压缩等场景。
- 条件计数:直接取返回索引数组的长度,即可快速统计符合条件的元素总数,比如
len(np.where(z)[0])即可得到数组z中True的总个数。
内容的提问来源于stack exchange,提问作者Subramanya Krishna
相关产品推荐
相关产品推荐

