通过多维度索引进行转置操作

时间:2017-02-10 16:44:52

标签: python numpy multidimensional-array

当我同时索引多个维度时,我遇到了numpy ndarray的问题:

> a = np.random.random((25,50,30))
> b = a[0,:,np.arange(30)]
> print(b.shape)

我希望结果为(50,30),但实际结果是(30,50)

有人可以向我解释,但是我没有得到它,这个功能在我的代码中引入了大量的错误。谢谢:))

其他信息:

一维索引非常有效:

> b = a[0,:,:]
> print(b.shape)
(50,30)

当我有换位时:

> a[0,:,0] == b[0,:]
True

2 个答案:

答案 0 :(得分:1)

来自numpy docs

  

了解情况的最简单方法可能是用术语来思考   结果形状。索引操作分为两部分,   由基本索引定义的子空间(不包括整数)和   来自高级索引部分的子空间。两个索引案例   需要区分组合:

     

高级索引由切片,省略号或新轴分隔。   例如x [arr1,:,arr2]。

     

高级索引彼此相邻。例如x [...,   arr1,arr2,:] 但不是x [arr1,:,1],因为1是一个高级索引   这方面。

     

在第一种情况下,由高级索引产生的尺寸   操作首先出现在结果数组中,以及子空间维度   之后。在第二种情况下,来自高级的尺寸   索引操作同时插入到结果数组中   他们在初始数组中的位置(后者的逻辑是什么   简单的高级索引表现就像切片一样。)

(我的重点)突出显示的位适用于您的

b = a[0,:,np.arange(30)]

答案 1 :(得分:1)

当您使用列表或整数数组来索引numpy数组时,您正在使用一种称为Fancy Indexing的东西。花式索引的规则并不像人们想象的那么简单。这就是您的数组具有错误维度的原因。为了避免意外,我建议你坚持切片。因此,您应该将代码更改为:

a = np.random.random((25,50,30))
b = a[0,:,:]
print(b.shape)