NumPy数组索引: 列表索引和np.array索引得出不同的结果。

3

我想使用列表和np.array索引来索引一个np.array,但它们会得到不同的结果。

以下是一个示例:

import numpy as np 
x = np.arange(10)
idx = [[0, 1], [1, 2]]
x[np.array(idx)]  # returns array([[0, 1], [1, 2]])

但是直接应用列表会出错

x[idx]  # raises IndexError: too many indices for array

我期望上述代码返回与使用np.array索引相同的结果。有任何想法吗?
我正在使用Python 3.5NumPy 1.13.1

在numpy 1.15中,第二种情况会发出警告,要求您澄清您是指 x[tuple(idx)] 还是 x[np.array(idx)] - Eric
2个回答

3

如果它是一个数组,那么它将被解释为包含索引的最终数组的形状 - 但如果它是一个列表,则是沿着“维度”(多维数组索引)的索引。

因此,第一个示例(使用array)等效于:

[[x[0], x[1],
 [x[1], x[2]]

但是第二个例子(list)的解释如下:
[x[0, 1], x[1, 2]]

但是,x[0, 1]会产生IndexError: too many indices for array错误,因为你的x只有一个维度。

这是因为list被解释为元组,与将它们“分开”传递相同:

x[[0, 1], [1, 2]]
          ^^^^^^----- 第二维的索引
  ^^^^^^------------- 第一维的索引

2
列表有时被视为元组。 - user2357112

1

来自numpy indexing文档:

ndarrays可以使用标准的Pythonx[obj]语法进行索引,其中x是数组,obj是选择。

...
obj是切片对象(由括号内的start:stop:step符号构造),整数或slice对象和整数的元组时,会发生基本切片。 Ellipsisnewaxis对象也可以与这些对象交替使用。为了保持向后兼容Numeric中的常见用法,如果选择对象是任何非ndarray序列(如list)包含slice对象、Ellipsis对象或newaxis对象,则也会启动基本切片,但不适用于整数数组或其他嵌入式序列。 ...


这个问题中的例子都没有触发基本切片,数组触发高级索引,而列表则因为文档没有充分解释的原因而触发不同的高级索引。 - user2357112

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