183

这出现在 Hidden features of Python中,但我看不到很好的文档或示例来解释该功能的工作原理。

4

4 回答 4

279

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

它的目的是在这一点上插入尽可能多的完整切片 ( :) 以将多维切片扩展到所有维度

示例

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

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

于 2008-09-23T00:55:09.367 回答
116

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

因此,它的语法完全取决于您或其他人是否编写了代码来理解它。

Numpy 使用它,如文档中所述。这里有一些例子。

在您自己的课程中,您会像这样使用它:

>>> 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 文档语言参考。但这些都不是很有帮助。

于 2008-09-23T00:24:21.360 回答
70

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

于 2008-09-23T09:34:48.480 回答
10

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

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

例子:

>>> 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])
于 2018-06-07T04:03:58.113 回答