NumPy二维数组分轴布尔索引运行原理及官方文档咨询
NumPy双轴布尔索引运行逻辑说明
现有代码的执行逻辑
当你为二维NumPy数组同时传入两个一维布尔数组作为索引时,触发的是配对花式索引规则,而非你预期的双轴独立筛选后取交叉区域的逻辑:
- 两个布尔数组会先分别转换为对应轴上的整数位置索引:
- 行维度(axis0)的
[True, False, True]对应索引值[0, 2] - 列维度(axis1)的
[True, False, True]对应索引值[0, 2]
- 行维度(axis0)的
- 两个索引序列长度一致时,NumPy会按顺序配对坐标:
(0, 0)、(2, 2),最终取出这两个坐标对应的值0、8,也就是你得到的输出结果。
预期效果的实现逻辑
你想要的「行、列布尔值均为True的所有交叉位置」本质是两个索引序列的笛卡尔积选取,NumPy中需要通过额外处理实现:
- 方式1:分两次索引,先筛选行再筛选列:
a[[True, False, True]][:, [True, False, True]] # 输出:array([[0, 2], [6, 8]]),展平后即为你预期的[0,2,6,8] - 方式2:用
np.ix_接口封装索引序列,直接生成笛卡尔积坐标:a[np.ix_([True, False, True], [True, False, True])] # 输出和上面完全一致
内容的提问来源于stack exchange,提问作者Sewoo Lee
相关产品推荐
相关产品推荐

