这是Python的“隐藏”功能中提到 的,但是我看不到很好的文档或说明该功能如何工作的示例。
这是Python的“隐藏”功能中提到 的,但是我看不到很好的文档或说明该功能如何工作的示例。
Answers:
Ellipsis
,或者...
不是隐藏功能,它只是一个常量。例如,它与JavaScript ES6完全不同,后者是语言语法的一部分。没有内置的类或Python语言构造函数使用它。
因此,它的语法完全取决于您或其他人是否具有编写代码来理解它。
在您自己的班级中,您将像这样使用它:
>>> 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
省略号用在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])
在您自己的实现中,您可以随意忽略上述合同并将其用于您认为合适的任何事情。
a[:,:,:,0]
会返回副本并a[...,0]
返回“视图”而不是副本吗?我尝试id()
同时针对版本和3-dim数组运行: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
所有ID均不同,而:a[..., 0], a[..., 1], a[..., 2]
ID均相同。
id()
两者都返回相同的值。还要检查与__array_interface__['data']
显示相同的内存地址。
a[indexes, ...]
即使a是一维数组,我们也可以使用!
这是Ellipsis的另一种用法,它与切片没有关系:我经常在与队列的线程内通信中使用它,作为信号表示“完成”;它在那里,它是一个对象,它是一个单例,其名称表示“缺乏”,而且不是过度使用的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])