我有一个多维数组,有两个整数列表L_i和L_j,分别对应于我想保留的axis-i和axis-j的元素,我还想满足以下条件:
1.保持数组的原始维数,即使L_i或L_j只包含1个元素(换句话说,我不希望单元素轴被折叠)
1.保留轴的顺序
最干净的方法是什么?
下面是一个可重现的示例,它显示了我所遇到的一些意外行为:
import numpy as np
aa = np.arange(120).reshape(5,4,3,2)
aa.shape
### (5,4,3,2) as expected
aa[:,:,:,[0,1]].shape
### (5, 4, 3, 2) as expected
aa[:,:,:,[0]].shape
### (5,4,3,1) as desired. Notice that even though the [0] is one element,
### that last axis is preserved, which is what I want
aa[:,[1,3],:,[0]].shape
### (2, 5, 3) NOT WHAT I EXPECTED!!
### I was expecting (5, 2, 3, 1)
好奇为什么numpy是崩溃和重新排序轴,也是最好的方式做我的子集正确。
2条答案
按热度按时间pkmbmrz71#
关于你问题的答案...
因为高级索引
[1,3]
和[0]
被一起广播以形成形状(2,)
子空间,该形状(2,)
子空间替换它们索引的子空间(即,分别具有大小4
和2
的轴)。因为高级索引被一个切片分隔开,所以没有明确的位置放置新的shape
(2,)
子空间,结果numpy将它放在数组的前面,切片维度在后面(shape(5, 3)
)。...因此,您只剩下一个shape
(2, 5, 3)
数组。有关更多信息,请参阅numpy指南中关于组合基本和高级索引的部分。
PS:仍然可以只使用一个索引调用来获得你想要的形状,但是你必须放弃切片,而是定义传播到形状
(5, 2, 3, 1)
的索引,例如使用np.ix_
:xkrw2x1b2#
一次减少一个轴: