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

时间:2008-09-23 00:17:10

标签: python numpy subclass slice ellipsis

这出现在Hidden features of Python,但我看不到可以解释该功能如何运作的好文档或示例。

4 个答案:

答案 0 :(得分:209)

省略号用于切割高维数据结构。

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

示例

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

现在,您有一个2x2x2x2的4维矩阵。要选择第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])

在您自己的实施中,您可以自由地忽略上述合同,并将其用于您认为合适的任何内容。

答案 1 :(得分:94)

你在自己的班级中使用它,因为没有内置类可以使用它。

Numpy使用它,如documentation中所述。一些例子here

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

>>> 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 documentationlanguage reference。但那些并不是很有帮助。

答案 2 :(得分:69)

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

答案 3 :(得分:2)

如其他答案所述,它可用于创建切片。 当您不想编写许多完整切片符号(:)时,或者您不确定要操作的数组的维数时,这非常有用。

我认为重要的是要突出显示,而其他答案中缺少的是,即使没有更多尺寸需要填写,也可以使用它。

示例:

>>> 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])