Numpy索引异常:如何从多维数组中进行子选择并保留所有轴

x33g5p2x  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(106)

我有一个多维数组,有两个整数列表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是崩溃和重新排序轴,也是最好的方式做我的子集正确。

pkmbmrz7

pkmbmrz71#

关于你问题的答案...

  • 为什么麻木要把斧头弄倒?

因为高级索引[1,3][0]被一起广播以形成形状(2,)子空间,该形状(2,)子空间替换它们索引的子空间(即,分别具有大小42的轴)。

  • 为什么那比要重新排列坐标轴?

因为高级索引被一个切片分隔开,所以没有明确的位置放置新的shape (2,)子空间,结果numpy将它放在数组的前面,切片维度在后面(shape (5, 3))。
...因此,您只剩下一个shape (2, 5, 3)数组。
有关更多信息,请参阅numpy指南中关于组合基本和高级索引的部分。
PS:仍然可以只使用一个索引调用来获得你想要的形状,但是你必须放弃切片,而是定义传播到形状(5, 2, 3, 1)的索引,例如使用np.ix_

>>> aa[ np.ix_([0, 1, 2, 3, 4], [1, 3], [0, 1, 2], [0]) ].shape
(5, 2, 3, 1)
xkrw2x1b

xkrw2x1b2#

一次减少一个轴:

aa[:, [1, 3], :, :][..., [0]].shape
(5, 2, 3, 1)

相关问题