为什么使用数组作为索引会改变多维 ndarray 的形状?

Why using an array as an index changes the shape of a multidimensional ndarray?

我有一个 4 维 NumPy 数组,轴为 x、y、z、t。我想取对应于 t=0 的切片并排列 y 轴上的顺序。

我有以下

import numpy as np
a = np.arange(120).reshape(4,5,3,2)
b = a[:,[1,2,3,4,0],:,0]
b.shape

我得到 (5, 4, 3) 而不是 (4,5,3)。

当我输入

aa = a[:,:,:,0]
bb = aa[:,[1,2,3,4,0],:]
bb.shape

我得到了预期的 (4,5,3)。有人可以解释为什么第一个版本交换前两个维度吗?

正如@hpaulj 在评论中提到的,此行为是因为混合了基本切片 高级索引:

a = np.arange(120).reshape(4,5,3,2)
b = a[:,[1,2,3,4,0],:,0]

在上面的代码片段中,会发生以下情况:

  • 当我们沿最后一个维度进行基本切片时,它会触发 __getitem__ 调用。所以,那个维度消失了。 (即没有单例维度)
  • [1,2,3,4,0] returns 来自第二个维度的 5 个切片。将此形状放入返回的数组中有两种可能性:在第一个或最后一个位置。 NumPy 决定将其放在第一维。这就是为什么在返回的形状元组的第一个位置得到 5 (5, ...) 的原因。如果我没记错的话,Jaime 在一次 PyCon 演讲中解释了这一点。

  • 沿第一和第三维度,由于您使用 : 对所有内容进行切片,沿这些维度的原始长度将被保留。

将所有这些放在一起,NumPy returns 形状元组为:(5, 4, 3)

您可以在 numpy-indexing-ambiguity-in-3d-arrays and arrays.indexing#combining-advanced-and-basic-indexing

阅读更多相关信息