我刚刚偶然发现一个数组 innumpy
可能被一个空元组索引:
In [62]: a = arange(5)
In [63]: a[()]
Out[63]: array([0, 1, 2, 3, 4])
我在numpy wiki ZeroRankArray上找到了一些文档:
(萨沙)首先,无论对 x[...] 和 x[()] 做出何种选择,它们都应该是相同的,因为 ... 只是“尽可能多:必要时”的语法糖,在零的情况下排名导致 ... = (:,)*0 = ()。其次,零级数组和 numpy 标量类型在 numpy 中是可以互换的,但是 numpy 标量可以在 ndarrays 不能的某些 python 结构中使用。
因此,对于 0-d 数组a[()]
,a[...]
应该是等价的。它们也适用于高维数组吗?他们强烈地看起来是:
In [65]: a = arange(25).reshape(5, 5)
In [66]: a[()] is a[...]
Out[66]: False
In [67]: (a[()] == a[...]).all()
Out[67]: True
In [68]: a = arange(3**7).reshape((3,)*7)
In [69]: (a[()] == a[...]).all()
Out[69]: True
但是,它不是语法糖。不适用于高维数组,甚至不适用于 0-d 数组:
In [76]: a[()] is a
Out[76]: False
In [77]: a[...] is a
Out[77]: True
In [79]: b = array(0)
In [80]: b[()] is b
Out[80]: False
In [81]: b[...] is b
Out[81]: True
然后是空列表索引的情况,它完全做其他事情,但看起来等同于使用空索引ndarray
:
In [78]: a[[]]
Out[78]: array([], shape=(0, 3, 3, 3, 3, 3, 3), dtype=int64)
In [86]: a[arange(0)]
Out[86]: array([], shape=(0, 3, 3, 3, 3, 3, 3), dtype=int64)
In [82]: b[[]]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
IndexError: 0-d arrays can't be indexed.
因此,看起来()
和...
相似但并不完全相同,并且索引[]
完全意味着其他东西。And a[]
or b[]
are SyntaxError
s。使用列表进行索引记录在索引数组中,并且有一个关于使用元组索引的简短通知中,并且在同一文档的末尾。
这就留下了一个问题:
a[()]
和之间的区别是a[...]
设计那么设计是什么?
(问题让人想起:空的`()`在Matlab矩阵上做了什么?)
编辑:
事实上,即使是标量也可能被一个空元组索引:
In [36]: numpy.int64(10)[()]
Out[36]: 10