为什么Numpy中的数组索引会产生此结果?

时间:2018-12-12 17:43:19

标签: python numpy

根据numpy documentation,将数组索引指定为array_name[x, y]array_name[x][y]是等效的,并且应产生相同的结果。但是,以下代码段:

import numpy as np

a = np.empty((7, 8, 9), dtype = object)
# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)

产生输出:

(7,) (8,) (9,)    
(9,) (9,) (9,)

分别显然不相等。有什么作用?

1 个答案:

答案 0 :(得分:1)

您误解了numpy如何解释索引/切片。对于类似a[x, y, z]的事物,numpy使用x沿第一个维度进行选择,y沿第二个维度进行选择,z沿第三个维度进行选择。

但是,对于类似a[x][y][z]的事物,numpy在x的第一维上使用a,而在y的第一维上使用a[x],和z沿a[x][y]的第一个维度。

如果您将:与某个数字进行比较,可能会造成混淆。为什么会这样呢?一种是切片(:),另一种是索引(no :)。因为沿维切片(使用:)实际上并不能减小数组的维数,而索引却可以。

可能有很多例子可以表示这一点,但是我认为最好在具有数组的ipython中玩,看看不同的索引和切片如何影响输出。但是,我将提供一两个示例专门回答您的问题

import numpy as np

a = np.arange(2*3*4).reshape((2,3,4))

a
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

# First indexing notation
print(a[:, 0, 0].shape, a[0, :, 0].shape, a[0, 0, :].shape)
# Prints (2,) (3,), (4,)

打破这一点,我们采取每一个:

  • a[:, 0, 0]包含所有第一个维度,而第0个元素则包含第二个和第三个维度。
  • a[0, :, 0]接受第一个维度的第0个元素,所有第二个维度以及第三个维度的第0个元素。
  • a[0, 0, :]在第一个维度和第二个维度中使用第0个元素,在第三个维度中使用所有元素。

# Second indexing notation
print(a[:][0][0].shape, a[0][:][0].shape, a[0][0][:].shape)
# Prints (4,) (4,) (4,)

在这种情况下:

  • a[:]a基本相同(返回矩阵的新view-谷歌“ numpy视图”以获取更多信息)。由于a[:]a相同,因此a[:][0]选择0
  • 的第一个维度中的a元素 >
  • 等...

OP说:

  

根据numpy documentation,将数组索引指定为array_name [x,y]和array_name [x] [y]是等效的

这是真的!要认识的主要事情是(尽管相关)索引编制和切片不是同一件事(正如我上面指出的那样)。