为何Numpy中元素索引与逻辑索引组合后数组维度转置?
解决Numpy布尔索引后轴顺序反转的问题
嘿,我来帮你搞定这个轴顺序的小麻烦~
首先咱们先理清楚问题根源:你用foo[0,:,mask,0]索引时,在Numpy 1.14.0这个旧版本中,布尔索引的轴处理逻辑和你预期的不太一致,导致最终结果的轴顺序反转了。不过别担心,有几种简单直接的解决办法:
方法1:直接交换轴顺序(最快捷)
既然结果形状是(2,4),而你需要(4,2),用转置操作就能一键调整:
bar = foo[0,:,mask,0].T # 或者更明确的写法: bar = foo[0,:,mask,0].transpose()
方法2:用take精准控制索引轴
如果你不想事后调整轴顺序,可以用np.take明确指定要操作的轴,从根源避免顺序混乱:
# 先提取轴0=0和轴3=0的子集,再在轴2上按mask提取 temp = foo[0,:,:,0] bar = temp.take(np.where(mask)[0], axis=1)
这样得到的bar形状就是你预期的(4,2),因为take会严格保留原数组的轴顺序。
方法3:把布尔索引转成整数索引
你也可以将布尔mask转换成对应的整数位置索引,这种方式更直观,也能避免轴顺序反转:
idx = np.where(mask)[0] # 得到array([0, 1]) bar = foo[0,:,idx,0]
这种索引方式和布尔索引效果完全一致,但轴顺序会严格遵循原数组的结构。
其实你猜测的广播机制关联不大,本质是旧版本Numpy对布尔索引的轴优先级处理和你预期不同,上面的方法都能完美解决这个问题~
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

