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

问题描述 投票:0回答:5

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

python numpy subclass slice ellipsis
5个回答
308
投票

省略号在 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])

在您自己的实现中,您可以自由地忽略上述合同并将其用于您认为合适的任何地方。


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文档语言参考。但这些并没有多大帮助。


74
投票

这是 Ellipsis 的另一个用途,它与切片无关:我经常在与队列的线程内通信中使用它,作为表示“完成”的标记;它在那里,它是一个对象,它是一个单例,它的名字意味着“缺乏”,而且它不是过度使用的 None (它可以作为正常数据流的一部分放入队列中)。 YMMV.


15
投票

正如其他答案中所述,它可用于创建切片。 当您不想编写许多完整切片符号 (

:
),或者当您不确定所操作的数组的维数是多少时,这很有用。

我认为重要的是要强调的是,即使没有更多的维度需要填充,它也可以使用,而其他答案却忽略了这一点。

示例:

>>> 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])

0
投票

与 Numpy 一起使用时,

Ellipsis
...
允许编写适用于一维向量和高维数组的通用函数。

例如,假设我们想编写一个(故意微不足道的)函数,从数组的每一行中提取一组特定的元素

def fun(arr):
    return arr[:, 1:4]

我们创建一个 2 维数组

>>> a = np.arange(3*5).reshape(3, 5)
>>> a

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

此函数对数组

a
的结果给出

>>> fun(a)

array([[ 1,  2,  3],
       [ 6,  7,  8],
       [11, 12, 13]])

但是,如果我们现在创建一个 1 维向量

b

>>> b =  np.arange(5)
>>> b

array([0, 1, 2, 3, 4])

该函数会抛出

b
错误,因为它只有一维

>>> fun(b)

IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

可以使用

Ellipsis
...
Numpy 表示法

编写适用于向量和数组的通用函数
def fun_ell(arr):
    return arr[..., 1:4]

对于矩阵(或高维数组)和向量都按预期工作

>>> fun_ell(a)

array([[ 1,  2,  3],
       [ 6,  7,  8],
       [11, 12, 13]])

>>> fun_ell(b)

array([1, 2, 3])

此功能对于更复杂的函数很有用,并在 Numpy 包中广泛使用。

© www.soinside.com 2019 - 2024. All rights reserved.