Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 元组索引numpy数组的奇怪行为_Python_Arrays_Numpy_Indexing - Fatal编程技术网

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

Python 元组索引numpy数组的奇怪行为,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我注意到在用元组列表(使用Python2.7.8和numpy 1.9.1)索引平面numpy数组时出现了一些令人困惑的行为。我的猜测是,这与数组维度的最大数量(我认为是32)有关,但我还没有找到文档 >>> a = np.arange(100) >>> tuple_index = [(i,) for i in a] >>> a[tuple_index] # This works (but maybe it shouldn't) >>

我注意到在用元组列表(使用Python2.7.8和numpy 1.9.1)索引平面numpy数组时出现了一些令人困惑的行为。我的猜测是,这与数组维度的最大数量(我认为是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...
>a=np.arange(100)
>>>元组索引=[(i,)表示a中的i]
>>>一个[元组索引]#这是可行的(但也许不应该)
>>>一个[tuple_index[:32].#这也有效
>>>一个[tuple_index[:31].#这会中断2>>一个[tuple_index[:1].#这同样有效。。。

如果元组列表为32个元素或更大,是否正在“展平”元组列表?这在什么地方有记录吗?

不同之处在于,第一个示例触发了奇特的索引(它只是从同一维度选择列表中的索引),而
tuple_index[:31]
被视为索引元组(这意味着从多个轴进行选择)

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

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

/*
*具有任何切片对象的序列
(我还没有在SciPy网站的官方文档中找到这方面的参考。)

这使得
a[tuple_index[:3]]
相当于
a[(0,),(1,),(2,)]
,因此出现了“索引太多”错误(因为
a
只有一个维度,但我们暗示有三个维度)


另一方面,
a[tuple_index]
a[[(0,),(1,),(2,),…,(99,)]
一样生成2D数组。

有趣的是,我得到了一条不同的错误消息:
索引器:不支持的迭代器索引
。使用Python2.7和Numpy1.8.2Sorry,我应该指定版本(Python2.7.8;Numpy1.9.1)。我已经更新了这个问题。索引数组必须是整数类型的声明。显然,实现无论如何都允许这样做。我仍然不明白的是,为什么从元组列表中得到一个大于
np.MAXDIMS
的2D数组。我同意这看起来并不明显(我也不知道这是不是有意的)。当长度超过
MAXDIMS
时,元组列表
[(0,),(1,),(2,)…,(99,)]
将在内部强制转换为NumPy数组(它将成为2D数组)。然后,这将用于索引原始1D数组(返回2D数组)。
>>> np.MAXDIMS
32