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 处的元素。这次有四个独特的元素:2
和 6
来自第二个维度中的第一个元素,7
和 23
来自第二个维度中的第二个元素。 Numpy 在嵌套列表中按维度对它们进行分组。
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))
.
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 处的元素。这次有四个独特的元素:2
和6
来自第二个维度中的第一个元素,7
和23
来自第二个维度中的第二个元素。 Numpy 在嵌套列表中按维度对它们进行分组。x[:, :, :, 1]
失败,因为数组只有三个维度 - 无法进一步细分任何第三个维度的元素。