用索引对Numpy数组进行索引

3
我写了以下内容:
arr3=np.array([[[1,2,3],[1,2,3],[1,2,3],[1,2,3]],[[2,2,3],[4,2,3],[4,2,2],[2,2,2]],[[1,1,1],[1,1,1],[1,1,1],[1,1,1]]])

正如我所预料的那样,
arr3[0:3,1] 应该返回与
arr3[0:3][1] 相同的结果:array([[2, 2, 3],[4, 2, 3],[4, 2, 2],[2, 2, 2]])

但它返回的是:array([[1, 2, 3],[4, 2, 3],[1, 1, 1]]).

顺便说一下,我正在使用Jupyter笔记本中的python3。

2个回答

3
当执行arr3[0:3,1]时,你是从第一个轴中的0:3元素中取出元素,然后对于每个元素,取第一个element
这与使用arr3[0:3]在第一个轴中取出0:3并从该轴中取出第一个array的结果不同。
所以在这种情况下,0:3部分在任何情况下都没有任何作用,因为array的形状为(3, 4, 3),因此只需取first3即可将相同的array返回。这在第二种情况下完全没有作用,但在第一种情况下,它实际上充当了占位符,以便你可以访问第二个轴,但是为此应该使用冒号:[:, some_index]
看到它如何成为相同的array了吗?
>>> arr3[0:3]
array([[[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]],

       [[2, 2, 3],
        [4, 2, 3],
        [4, 2, 2],
        [2, 2, 2]],

       [[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]]])

但是,当你执行 arr3[:, 1] 时,你正在从 array第二个axis中取出第二个元素,因此会得到:

array([[1, 2, 3],
       [4, 2, 3],
       [1, 1, 1]])

而在另一种情况下,你正在从数组的第一个中取第二个元素,所以:

array([[2, 2, 3],
       [4, 2, 3],
       [4, 2, 2],
       [2, 2, 2]])

请参阅此网页,详细了解有关numpy索引的信息。请注意以下描述,它直接适用于您的问题:
当索引中至少有一个切片(:)、省略号(...)np.newaxis,或数组的维数多于高级索引时,则行为可能更加复杂。这就像将每个高级索引元素的索引结果连接起来

@kylechan 如果你还没有的话,请点击“接受”(答案旁边的灰色勾号)和“点赞”。 - Joe Iddon
完成!这是我第一次使用Stack Overflow。感谢您的耐心。 - kyle chan
@kylechan 没问题,这是一个对于新用户来说措辞得当的问题 :) - Joe Iddon

1
让我们来看看我们的多维NumPy数组:

import numpy as np
arr3=np.array([
    [
        [1,2,3],[1,2,3],[1,2,3],[1,2,3]
    ],[
        [2,2,3],[4,2,3],[4,2,2],[2,2,2]
    ],[
        [1,1,1],[1,1,1],[1,1,1],[1,1,1]
    ]
])
print(arr3[0:3,1])

那会返回:

[[1 2 3]
 [4 2 3]
 [1 1 1]]

这是有道理的,因为我们正在获取第1到3行的行号,并且仅抓取第一列。

然而,arr3[0:3][1]返回的是从第0行到第3行的数组,然后选择第二行(或行索引1)。

观察:

print(arr3[0:3])

返回:
[[[1 2 3]
  [1 2 3]
  [1 2 3]
  [1 2 3]]

 [[2 2 3]
  [4 2 3]
  [4 2 2]
  [2 2 2]]

 [[1 1 1]
  [1 1 1]
  [1 1 1]
  [1 1 1]]] 

它返回一个新的数组(实际上与我们当前的数组相同,因为我们刚刚请求了数组中的所有行)。然后我们要求第二行:
print(arr3[0:3][1])

返回:
[[2 2 3]
 [4 2 3]
 [4 2 2]
 [2 2 2]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接