x[:] [1] 和 x [:,1] 之间的索引有什么区别?

What is the difference for the indexing between x[:] [1] and x [:,1]?

我很难理解这两种索引之间的区别。 假设我有一个嵌套的嵌套列表:

x = np.array([[[1,2],[5,6]],[[9,7],[12,23]]])

如果我做到了

x[:][:][1] and x[:,:,1]

我会得到

[[9 7][12 23]] 
[[5 6][12 23]] 

分别

老实说,我不知道如何得到这些结果。有人可以向我解释如何获得这些数组的步骤吗?

这与 python 的切片语法有关。本质上,obj[a:b:c]obj.__getitem__(slice(a,b,c)).

的句法 shorthand

x[:] 只是 returns x 的 'full slice' - 也就是说,它 returns 是 x 的精确副本。做 x[:][:][1] 与做 x[1] 没有什么不同。

与此同时,x[:,:,1] 等同于:

x.__getitem__((slice(), slice(), 1))

使用三元组作为索引。对于普通的 python list,这会失败,但 Numpy 会优雅地接受它。要了解 Numpy 是如何做到这一点的,让我们仔细看看这个例子:

>>> x = np.array([[[1,2],[5,6]],[[9,7],[12,23]]])
>>> x[1]
array([[ 9,  7],
       [12, 23]])
>>> x[:,1]
array([[ 5,  6],
       [12, 23]])
>>> x[:,:,1]
array([[ 2,  6],
       [ 7, 23]])
>>> x[:,:,:,1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array: array is 3-dimensional, but 4 were indexed

我们可以看到一个规律。

当你给 Numpy 数组一个元组作为索引时,它会将元组的每个元素映射到一个维度,然后将元组的后续元素应用于这些维度中的每一个。简而言之:

  • x[1] 只是从数组的第一维获取索引为 1 的元素。这是单元素[[9, 7], [12, 23]]
  • x[:, 1] 从数组第一维的 每个元素 获取索引 1 处的元素。也就是说,它从数组的第二维获取索引为1的元素。这是两个元素:[5, 6][12, 23]。 Numpy 将它们组合在一个列表中。
  • x[:, :, 1] 遵循相同的模式 - 它从数组的 第三维 获取索引 1 处的元素。这次有四个独特的元素:26 来自第二个维度中的第一个元素,723 来自第二个维度中的第二个元素。 Numpy 在嵌套列表中按维度对它们进行分组。
  • x[:, :, :, 1] 失败,因为数组只有三个维度 - 无法进一步细分任何第三个维度的元素。