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

210 投票
4 回答
66802 浏览
提问于 2025-04-11 09:20

这个问题出现在 Python的隐藏特性 这个讨论里,但我找不到好的文档或例子来解释这个特性是怎么工作的。

4 个回答

74

这是对省略号(Ellipsis)的另一种用法,跟切片没有关系。我经常在多线程之间用它来进行通信,特别是在队列中,作为一个“完成”的标记。它是一个对象,属于单例模式,名字的意思是“缺少”,而不是常用的None(None可以作为正常数据流的一部分放入队列)。你的情况可能会有所不同。

308

省略号在numpy中用来切片更高维的数据结构。

它的意思是在这个位置,插入尽可能多的完整切片(:),以扩展多维切片到所有维度

举个例子:

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

现在,你有一个4维的矩阵,大小是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])

在你自己的实现中,你可以忽略上面提到的规则,随意使用它。

134

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 的文档语言参考。不过这些可能不是很有帮助。

撰写回答