Python 具有多维索引的转置操作

Python 具有多维索引的转置操作,python,numpy,multidimensional-array,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) 有人能给我解释一下吗?我不明白,这个特性在我的代码中引入了大量的bug。谢谢:) 其他信息: 一维索引非常有效: > b = a[0,:,:] > print(b.shape

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

> a = np.random.random((25,50,30))
> b = a[0,:,np.arange(30)]
> print(b.shape)
在这里,我期望结果是
(50,30)
,但实际上真正的结果是
(30,50)

有人能给我解释一下吗?我不明白,这个特性在我的代码中引入了大量的bug。谢谢:)


其他信息:

一维索引非常有效:

> b = a[0,:,:]
> print(b.shape)
(50,30)
当我进行换位时:

> a[0,:,0] == b[0,:]
True
来自努比

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

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

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

在第一种情况下,由高级索引生成的维度 运算在结果数组中排在第一位,子空间维数 之后。在第二种情况下,从高级 索引操作同时插入到结果数组中 与初始数组中的位置相同(后一种逻辑使 简单的高级索引的行为就像切片一样)

(我强调)突出显示的部分适用于您的

b = a[0,:,np.arange(30)]
来自努比

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

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

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

在第一种情况下,由高级索引生成的维度 运算在结果数组中排在第一位,子空间维数 之后。在第二种情况下,从高级 索引操作同时插入到结果数组中 与初始数组中的位置相同(后一种逻辑使 简单的高级索引的行为就像切片一样)

(我强调)突出显示的部分适用于您的

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

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

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

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

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

谢谢你,保罗!你知道这种行为背后有什么逻辑吗?或者这只是一个确保用户在ndarray操作过程中超级专注的技巧:pIn是的,这是少数几个足够普遍的规则之一。例如,假设我们有
a2
2d和
a3
3d数组和一些线性索引数组
i=0,1,2,…
。然后a2[i,i]选取一维数组的对角线,观察输出的维度是索引数组的维度,而不是索引数组的维度。当我们使用3d数组时,这可能更加清晰,如so
a3[i,:,i]
这应该选择y轴和x,z平面的对角线。但是在新的阵列中,哪个轴应该先走?在(diag,y)和(y,diag)之间没有“自然”的选择方式,所以按照惯例,diag是第一位的。令人难以置信的清晰注释!很好,我现在明白了。是的,是的,是的(评论不会让我说“是的”,所以我说“是的,是的,是的”,大家都很高兴)谢谢你,保罗!你知道这种行为背后有什么逻辑吗?或者这只是一个确保用户在ndarray操作过程中超级专注的技巧:pIn是的,这是少数几个足够普遍的规则之一。例如,假设我们有
a2
2d和
a3
3d数组和一些线性索引数组
i=0,1,2,…
。然后a2[i,i]选取一维数组的对角线,观察输出的维度是索引数组的维度,而不是索引数组的维度。当我们使用3d数组时,这可能更加清晰,如so
a3[i,:,i]
这应该选择y轴和x,z平面的对角线。但是在新的阵列中,哪个轴应该先走?在(diag,y)和(y,diag)之间没有“自然”的选择方式,所以按照惯例,diag是第一位的。令人难以置信的清晰注释!很好,我现在明白了。是的,是的,是的(评论不会让我说“是的”,所以我说“是的,是的,是的”,大家都很高兴)