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

在Python中如何使用省略号切片语法?,python,numpy,subclass,slice,ellipsis,Python,Numpy,Subclass,Slice,Ellipsis,这是在中提出的,但我看不到好的文档或示例来解释该功能是如何工作的。省略号,或者。。。不是隐藏的特征,它只是一个常量。这与javascript ES6有很大不同,后者是语言语法的一部分。没有内置类或Python语言构造使用它 因此,它的语法完全取决于您或其他人是否编写了理解它的代码 Numpy使用它,如中所述。一些例子 在您自己的课堂上,您可以这样使用它: >>> class TestEllipsis(object): ... def __getitem__(self,

这是在中提出的,但我看不到好的文档或示例来解释该功能是如何工作的。

省略号,或者。。。不是隐藏的特征,它只是一个常量。这与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

当然,还有,还有。但这些都不是很有帮助

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

这意味着在这一点上,插入尽可能多的完整切片:将多维切片扩展到所有维度

例如:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
现在,你有一个2x2阶的四维矩阵。要选择第四维中的所有第一个元素,可以使用省略号符号

>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])
这相当于

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

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

这是省略号的另一个用途,它与切片无关:我经常在与队列的线程内通信中使用它,作为指示完成的标记;它就在那里,它是一个对象,它是一个单例,它的名字意味着缺少,它不是过度使用的无,它可以作为正常数据流的一部分放入队列中。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

在某个地方说:Done=object并使用它不是更清楚吗?不一定——它要求你在某个地方说Done=object。Sentinel值并不一定是一件坏事——而且在省略号中使用几乎无用的Python单例作为Sentinel并不是那么可怕,而且我使用过的方法不会让人感到混淆。关于Done=object,我认为使用省略号更好,尤其是当您使用它与队列通信时。如果您从线程内通信转到进程内通信,那么idDone在另一个进程中将不一样,并且没有任何东西可以区分一个对象和另一个对象。省略号的id也不一样,但至少类型是一样的——这是单身汉的观点。问题是如何使用省略号,但我相信你用错了。它有许多解释。但我认为正确的答案是:省略号是如何使用的?ie:我应该采取什么步骤在我自己的代码中使用省略号..看起来很糟糕,因为表示所有项目的最佳方式是>>>x[:]>>>>x[:,1:2]@Ronny:重点是演示省略号的一些自定义用法。链接似乎已经损坏。也许我错了,但[:,:,0]是否会返回副本和[…,0]是否将返回视图而不是副本?我尝试针对这两个版本运行id,并针对一个3维数组:a[:,:,:,:,0],a[:,,:,1],a[:,:,:,:,2]都有不同的id,而:a[…,0],a[…,1],a[…,2]都有相同的id。@mohitsharma44不在我的机器上;id为两者返回相同的值。同时检查显示相同的内存地址。什么是四维矩阵?可以将其称为四维数组,但不能称为矩阵。椭圆对于零维数据结构也很有用。它们是我知道的唯一写入标量numpy.ndarray的方法,例如:my_scalar=np.asarray 3;my_标量[…]=5。如果您使用my_scalar[:]=5,您将理所当然地得到一个错误,因为没有维度0可供:迭代。@SuperElectric您也可以使用my_scalar.itemsetscalarvalue。当然,我的标量[…]=标量值更短,但您在上面的评论中说,这是您知道的唯一方法。只是给了一个选择。
a[...,0,:]
array([0, 1])