当我同时索引多个维度时,我遇到了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
答案 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)