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

mir*_*e2k 146 python numpy subclass ellipsis slice

这出现在 Python的隐藏功能中,但我看不到可以解释该功能如何工作的好文档或示例.

Tor*_*rek 216

省略号用于切割高维数据结构.

它被设计为在这一点上,插入尽可能多的完整切片(:)以将多维切片扩展到所有维度.

示例:

>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Run Code Online (Sandbox Code Playgroud)

现在,您有一个2x2x2x2的4维矩阵.要选择第4维中的所有第一个元素,可以使用省略号表示法

>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])
Run Code Online (Sandbox Code Playgroud)

这相当于

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])
Run Code Online (Sandbox Code Playgroud)

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

  • 椭圆对于零维数据结构也很有用。它们是我所知道的写入标量 numpy.ndarrays 的唯一方法,例如: my_scalar = np.asarray(3); my_scalar[...] = 5。如果你执行 my_scalar[:] = 5,你会得到一个错误,因为 : 没有维度 0 来迭代。 (4认同)
  • @SuperElectric您还可以使用my_scalar.itemset(scalarvalue)。当然, my_scalar[...]=scalar_value 更短,但您在上面的评论中说过,这是您知道的唯一方法。只是提供一个替代方案。 (3认同)
  • 什么是4维矩阵?将其称为 4 维数组而不是矩阵是有意义的。,IMO。 (2认同)

nos*_*klo 96

你可以在自己的类中使用它,因为没有内置类可以使用它.

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
Run Code Online (Sandbox Code Playgroud)

当然,还有python文档语言参考.但那些并不是很有帮助.

  • @Ronny:重点是展示省略号的一些自定义用法. (30认同)
  • 看起来相当破碎,因为"propper"说出所有项目的方式是>>> x [:] >>> x [:,1:2] (6认同)
  • 链接似乎被打破了. (4认同)

tzo*_*zot 70

这是省略号的另一个用途,它与切片无关:我经常在与队列的线程内通信中使用它,作为发出"完成"信号的标记; 它就在那里,它是一个对象,它是一个单例,它的名字意味着"缺乏",并且它不是过度使用的无(可以作为正常数据流的一部分放入队列中).因人而异.

  • 可能不会更清楚地说:"Done = object()"在某个地方并且只是使用它? (14认同)
  • 不一定 - 它需要你在某处实际_say_ Done = object().Sentinel值并不一定是坏事 - 并且使用其他几乎无用的Python单例作为哨兵并不是那么可怕的IMO(省略号和()是我用过的,其中没有人会感到困惑). (11认同)
  • 关于Done = object(),我认为使用省略号更好,特别是如果你用它来与队列进行通信.如果从内部线程到内部进程通信,id(Done)在另一个进程中将不相同,并且没有任何东西可以将一个对象与另一个对象区分开来.省略号的ID也不一样,但至少类型是相同的 - 这是单身人士的要点. (6认同)

小智 9

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

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

例子:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Run Code Online (Sandbox Code Playgroud)

这将导致错误:

>>> a[:,0,:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Run Code Online (Sandbox Code Playgroud)

这将起作用:

a[...,0,:]
array([0, 1])
Run Code Online (Sandbox Code Playgroud)