如何在 Python 中使用省略号的切片语法?

这是在Python 的隐藏特性中出现的,但我找不到好的文档或例子来解释这个功能是如何工作的。

60574 次浏览

Ellipsis...不是一个隐藏的特性,它只是一个常量。它与javascript ES6完全不同,它是语言语法的一部分。没有内置类或Python语言构造使用它。

所以它的语法完全取决于你,或者其他人,写了代码来理解它。

Numpy使用它,正如文档. xml文件中所述。一些例子在这里

在你自己的课堂上,你会这样使用它:

>>> class TestEllipsis(object):
...     def __getitem__(self, item):
...         if item is Ellipsis:
...             return "Returning all items"
...         else:
...             return "return %r items" % item
...
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items

当然,有python文档语言参考。但这些都没什么用。

在numpy中使用省略号对高维数据结构进行切片。

它的意思是此时,插入尽可能多的完整切片(:)以将多维切片扩展到所有维度

例子:

>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)

现在,你有一个2x2x2x2阶的四维矩阵。要选择第4维中的所有第一个元素,可以使用省略号符号

>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

这相当于

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

在您自己的实现中,您可以自由地忽略上面提到的契约,并将其用于您认为合适的任何地方。

这是省略号的另一种用法,它与切片无关:我经常在与队列的线程内通信中使用它,作为信号“完成”的标记;它在那里,它是一个对象,它是一个单例,它的名字意味着“缺少”,它不是被过度使用的None(它可以作为正常数据流的一部分放在队列中)。YMMV。

正如在其他答案中所述,它可以用于创建切片。 当你不想写很多完整的切片符号(:),或者当你只是不确定被操作的数组的维度是什么时,这个函数很有用

我认为重要的是要强调的是,即使没有更多的维度需要填充,它也可以被使用,这在其他答案中是缺失的。

例子:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)

这将导致错误:

>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array

这是可行的:

a[...,0,:]
array([0, 1])