gpt4 book ai didi

python - 在 numpy 中,用空元组和省略号索引数组有什么作用?

转载 作者:太空狗 更新时间:2023-10-29 17:31:13 26 4
gpt4 key购买 nike

我刚刚偶然发现 numpy 中的数组可能由空元组索引:

In [62]: a = arange(5)

In [63]: a[()]
Out[63]: array([0, 1, 2, 3, 4])

我在 numpy wiki ZeroRankArray 上找到了一些文档:

(Sasha) First, whatever choice is made for x[...] and x[()] they should be the same because ... is just syntactic sugar for "as many : as necessary", which in the case of zero rank leads to ... = (:,)*0 = (). Second, rank zero arrays and numpy scalar types are interchangeable within numpy, but numpy scalars can be use in some python constructs where ndarrays can't.

因此,对于 0 维数组,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 维数组:

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

然后是用一个空的 list 进行索引的情况,它完全做了其他事情,但看起来等同于用一个空的 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.

因此,看起来 ()... 相似但不完全相同,使用 [] 进行索引意味着完全不同的东西. a[]b[]SyntaxError。使用列表编制索引记录在 index arrays , 并且有关于元组索引的简短通知 at the end of the same document .

剩下的问题是:

a[()]a[...] 之间的区别是设计使然吗?那什么是设计呢?

(问题有点让人联想到:What does the empty `()` do on a Matlab matrix?)

编辑:

事实上,即使是标量也可以用空元组索引:

In [36]: numpy.int64(10)[()]
Out[36]: 10

最佳答案

A[...] 的处理是一个特例,优化为 always return A itself :

if (op == Py_Ellipsis) {
Py_INCREF(self);
return (PyObject *)self;
}

任何其他应该等效的东西,例如A[:], A[(Ellipsis,)], A[()], A[(slice(None) ,) * A.ndim] 将返回整个 A View ,其 baseA :

>>> A[()] is A
False
>>> A[()].base is A
True

这似乎是不必要的过早优化,因为 A[(Ellipsis,)]A[()] 总是会给出相同的结果(对A)。从看https://github.com/numpy/numpy/commit/fa547b80f7035da85f66f9cbabc4ff75969d23cd似乎它最初是必需的,因为使用 ... 进行索引在 0d 数组上无法正常工作(在 https://github.com/numpy/numpy/commit/4156b241aa3670f923428d4e72577a9962cdf042 之前它会将元素作为标量返回),然后扩展到所有数组一致性;从那时起,索引已固定在 0d 数组上,因此不需要优化,但它设法保留下来(并且可能有一些代码依赖于 A[...] is A being是的)。

关于python - 在 numpy 中,用空元组和省略号索引数组有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14689270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com