【问题标题】:Why does array indexing in Numpy produce this result?为什么 Numpy 中的数组索引会产生这个结果?
【发布时间】:2018-12-13 05:03:16
【问题描述】:

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

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

分别,这显然是不等价的。什么给了?

【问题讨论】:

  • 使用[:] 进行索引没有任何作用。即使有一个列表,它也只是复制。使用x[....][...][...],您必须单独查看每个索引操作的操作。口译员一次应用一个。在[,.., ..., ...]numpy可以一起使用。
  • 等效仅适用于单元素索引,不适用于切片(使用:)或高级索引。
  • 知道了,谢谢。您能否解释一下导致 Python 在第二行产生结果的原因?
  • 如果省略[:],则归结为a[0][0],与a[0,0]a[0,0,:] 相同。
  • 但是第 2 行的所有三个表达式都计算为 a[0, 0, :] 是不是很奇怪?这是我缺少的某种功能吗?

标签: python numpy


【解决方案1】:

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

但是,对于a[x][y][z] 之类的东西,numpy 在a 的第一个维度上使用x,在a[x] 的第一个维度上使用y,在@ 的第一个维度上使用z 987654332@.

如果您将使用 : 与使用某个数字进行比较,这可能会令人困惑。为什么会这样?一种是切片(:),另一种是索引(没有:)。因为沿维度切片(使用:)实际上并没有减少数组的维度,而索引却可以。

可以有很多例子来表示这一点,但我认为你最好在 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] 采用所有第一个维度,0th 元素用于第二个和第三个维度。
  • a[0, :, 0] 采用第一个维度的0th 元素、第二个维度的所有元素以及第三个维度的0th 个元素。
  • a[0, 0, :]0th 元素用于第一维和第二维,将所有元素用于第三维。

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

在这种情况下:

  • a[:]a 基本相同(返回矩阵的新 view -- google "numpy view" 获取更多信息)。由于a[:]a 相同,a[:][0] 选择0元素沿a 的第一个维度
  • 等等……

OP 说:

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

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

【讨论】:

  • 这是有道理的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多