首页 > 解决方案 > 为什么 Numpy 中的数组索引会产生这个结果?

问题描述

根据numpy 文档,将数组索引指定为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,)

分别,显然是不等价的。是什么赋予了?

标签: pythonnumpy

解决方案


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

但是,对于类似的东西a[x][y][z],numpyx沿 的第一个维度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第二个和第三个维度的第 th 个元素。
  • a[0, :, 0]0第一个维度的第 th 个元素,第二个维度的所有0元素,以及第三个维度的第 th 个元素。
  • a[0, 0, :]0第 th 个元素用于第一维和第二维,并将所有元素用于第三维。

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

在这种情况下:

  • a[:]基本相同a(返回一个新view的矩阵——谷歌“numpy view”获取更多信息)。由于a[:]与 相同aa[:][0]选择沿第一个维度的0元素a
  • ETC...

OP 说:

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

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


推荐阅读