具有索引

时间:2017-11-18 07:56:51

标签: python python-3.x numpy

我写了以下内容:

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]])

BTW,我在Jupyter笔记本中使用python3

2 个答案:

答案 0 :(得分:3)

执行arr3[0:3,1]时,您将从第一个0:3中的axis获取元素,然后在第一个element中获取每个元素。

这会产生不同的结果,即使用0:3获取第一个轴中的arr3[0:3],然后从此array获取第一个axis

因此,在这种情况下,0:3部分在任何一种情况下都不执行任何操作,因为array's形状为(3, 4, 3),因此first 3只能为您提供返回相同的array。在第二种情况下,这绝对没有任何意义,但在第一种情况下,它确实充当占位符,以便您可以访问第二个axis,但为此您应该只使用冒号:{{1 }}

看看它是如何相同的[:, 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]第二个 axis中获取第二个元素,这样就会给你:

array

而在另一种情况下,你从数组的第一个 array([[1, 2, 3], [4, 2, 3], [1, 1, 1]]) 获取第二个元素,所以:

axis

要进一步了解array([[2, 2, 3], [4, 2, 3], [4, 2, 2], [2, 2, 2]]) numpy,请查看this page on scipy

请注意直接适用于您的问题的具体说明:

  

当索引中至少有一个切片indexing,省略号(:)(...)时(或者数组的维度多于高级索引),那么行为可以是更复杂。 就像连接每个高级索引元素

的索引结果一样

答案 1 :(得分: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]]