这个问题在Python 隐藏特性中出现,但我找不到好的文档或示例来解释该功能的工作原理。
在numpy中,省略号用于切片高维数据结构。
它的设计是表示在此处插入尽可能多的完整切片(:
)以将多维切片扩展到所有维度。
例子:
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
现在,你有一个二阶二次方的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])
在你自己的实现中,你可以自由地忽略上述提到的契约并将其用于任何你认为合适的用途。
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
- user78110x[:] x[:, 1:2]
这是省略号的另一个用法,与切片无关:我经常在线程内部与队列通信时使用它作为表示“完成”的标记;它就在那里,是一个对象,是一个单例,其名称意味着“缺乏”,并且它不是过度使用的 None(可以作为正常数据流的一部分放入队列中)。个人经验可能有所不同。
正如其他答案所述,它可以用于创建切片。当您不想编写许多完整的切片符号(:
)时非常有用,或者当您不确定正在操作的数组的维数时。
我认为需要强调的重要点是,即使没有更多的维度需要填充,它也可以使用。
例如:
>>> 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])
...
解释为“添加正确数量的:
,以便根据数组形状创建有效的索引”。在您的示例中,它不添加任何内容,对于3D数组,它将添加:,
,对于4D数组,它将添加:,:,
等等。这种解释是Numpy的解释,但另一个软件包或另一个开发者可能会以完全不同的方式解释...
,只要他们解释如何使用它。 - undefined
a[:,:,:,0]
不是会返回一个复制品,而a[...,0]
会返回“视图”而非复制品吗? 我试着对这两种版本分别运行id()
,对于一个三维数组:a[:,:,:, 1], a[:,:,:, 2]
它们的ID都不同,而:a[..., 1], a[..., 2]
它们的ID都相同。 - mohitsharma44id()
返回相同的值。同时,使用__array_interface__['data']
进行检查显示相同的内存地址。 - BoltzmannBraina[indexes, ...]
。 - acgtyrant