numpy数组索引:list index和np.array index给出不同的结果

时间:2017-09-08 12:26:53

标签: python arrays numpy indexing

我正在尝试使用list和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

2 个答案:

答案 0 :(得分:2)

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

所以第一个例子(带有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]]
          ^^^^^^----- indices for the second dimension
  ^^^^^^------------- indices for the first dimension

答案 1 :(得分:1)

来自 numpy indexing 文档:

  

ndarrays 可以使用标准Python x[obj]语法编制索引,其中x是数组,obj是选择。

     

...
  当obj是切片对象(由...构造)时,会发生基本切片   括号内的start:stop:step符号),整数或元组   slice个对象和整数。 Ellipsisnewaxis个对象可以   穿插这些也是如此。为了保持落后   与Numeric中的常见用法兼容,基本切片也是如此   如果选择对象是任何非ndarray序列(例如   包含list个对象,slice对象或Ellipsis的{​​{1}}}   对象,但不是表示整数数组或其他嵌入序列。 ...