Numpy布尔索引疑问:为何a[b1,b2]返回array([4,10])而非预期值?
问题分析:Numpy布尔数组索引的配对逻辑
先明确你的数组结构:
a = np.arange(12).reshape(3,4) # a的实际内容: # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] b1 = np.array([False, True, True]) # 对应第1、2行(索引从0开始) b2 = np.array([True, False, True, False]) # 对应第0、2列
你的预期是取b1选中的所有行和b2选中的所有列的交叉组合元素(行1+列0、行1+列2、行2+列0、行2+列2),但Numpy在这里的索引逻辑和你想的不一样:
- 当执行
a[b1, b2]时,Numpy会先把布尔数组转换成对应的整数索引数组:np.where(b1)→array([1, 2])np.where(b2)→array([0, 2])
- 随后Numpy会对这两个索引数组进行逐元素配对,也就是取
a[1,0]和a[2,2],对应的值就是4和10,这就是实际运行的结果。
如果要实现你预期的「选中行和选中列的所有交叉元素」,需要用np.ix_()构造笛卡尔积索引:
a[np.ix_(b1, b2)] # 输出:array([[ 4, 6], # [ 8, 10]]) # 展平后就是你预期的array([4,6,8,10])
或者先筛选行再筛选列,效果一致:
a[b1][:, b2]
核心区别:
a[b1, b2]是对应位置的索引配对,要求两个布尔数组转换后的索引数组长度一致a[np.ix_(b1, b2)]才是行和列的笛卡尔积筛选,得到选中行和列的所有交叉元素
内容的提问来源于stack exchange,提问作者Hesam Jokar
相关产品推荐
相关产品推荐

