元组索引numpy数组的奇怪行为

时间:2015-06-02 14:10:52

标签: python arrays numpy indexing

当使用元组列表索引一个扁平的numpy数组时(使用python 2.7.8和numpy 1.9.1),我注意到了一些令人困惑的行为。我的猜测是,这与数组维度的最大数量有关(我认为是32),但我无法找到文档。

>>> a = np.arange(100)
>>> tuple_index = [(i,) for i in a]
>>> a[tuple_index] # This works (but maybe it shouldn't)
>>> a[tuple_index[:32]] # This works too
>>> a[tuple_index[:31]] # This breaks for 2 <= i < 32
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array
>>> a[tuple_index[:1]] # This also works...

如果元组列表是32个元素或更大,那么它是否被“展平”了?这是在某处记录的吗?

1 个答案:

答案 0 :(得分:6)

差异似乎是第一个示例触发花式索引(它只是从同一维度中选择列表中的索引),而tuple_index[:31]则被视为索引元组(这意味着从多个轴中选择)。

如您所述,NumPy数组的最大维数是(通常)32:

>>> np.MAXDIMS
32

根据mapping.c文件中的以下注释(其中包含解释用户传递的索引的代码),任何短于32的元组序列都会被展平为索引元组:

/*
 * Sequences < NPY_MAXDIMS with any slice objects
 * or newaxis, Ellipsis or other arrays or sequences
 * embedded, are considered equivalent to an indexing
 * tuple. (`a[[[1,2], [3,4]]] == a[[1,2], [3,4]]`)
 */

(我还没有在SciPy网站的官方文档中找到这方面的参考资料。)

这使得a[tuple_index[:3]]等同于a[(0,), (1,), (2,)],因此&#34;指数太多&#34;错误(因为a只有一个维度但我们暗示有三个维度。“

另一方面,a[tuple_index]与导致2D数组的a[[(0,), (1,), (2,), ..., (99,)]]相同。