Numpy布尔索引输出逻辑解惑:为何a[b1,b2]结果非预期二维数组?
Numpy布尔索引配对机制解释
你遇到的是Numpy中布尔数组配对索引的特性,和你预期的“行筛选+列筛选”逻辑不一样,具体原理如下:
1. 布尔数组的索引转换
当你用a[b1, b2]时,Numpy会先把两个布尔数组转换成对应的位置索引数组:
b1 = [False, True, True]→ 对应行的位置索引是[1, 2](原数组的第2、3行)b2 = [True, False, True, False]→ 对应列的位置索引是[0, 2](原数组的第1、3列)
2. 配对索引的逻辑
Numpy此时会把两组索引一一配对,取每组配对对应的元素:
- 第一对:行索引1 + 列索引0 →
a[1, 0] = 4 - 第二对:行索引2 + 列索引2 →
a[2, 2] = 10
所以最终输出是这两个元素组成的一维数组array([4, 10])。
3. 如何实现你预期的二维输出
如果想要筛选b1对应的行,再在这些行里筛选b2对应的列,需要让行和列的索引做笛卡尔积组合,有两种常用方式:
方式1:分步索引
先筛选行,再对筛选后的结果筛选列:
>>> a[b1][:, b2] array([[ 4, 6], [ 8, 10]])
方式2:用np.ix_()转换索引
np.ix_()会把一维索引数组转换成可广播的形式,实现笛卡尔积索引:
>>> a[np.ix_(b1, b2)] array([[ 4, 6], [ 8, 10]])
内容的提问来源于stack exchange,提问作者Z.Lun
相关产品推荐
相关产品推荐

