如何在 Python 中使用省略号切片语法?
- 2025-02-28 08:22:00
- admin 原创
- 55
问题描述:
这出现在 Python 的隐藏功能中,但我看不到很好的文档或示例来解释该功能如何工作。
解决方案 1:
省略号在 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])
在您自己的实现中,您可以自由地忽略上面提到的合同并将其用于您认为合适的任何用途。
解决方案 2:
Ellipsis
,或者...
不是隐藏功能,它只是一个常量。它与 javascript ES6 完全不同,在 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 文档和语言参考。但这些都没什么用。
解决方案 3:
这是省略号的另一种用法,与切片无关:我经常在与队列的线程内通信中使用它,作为表示“完成”的标记;它就在那里,它是一个对象,它是一个单例,它的名字意味着“缺少”,它不是过度使用的 None(可以作为正常数据流的一部分放入队列中)。YMMV。
解决方案 4:
正如其他答案所述,它可用于创建切片。当您不想写很多完整的切片符号 ( :
),或者您不确定正在操作的数组的维数是多少时,它很有用。
我认为需要强调的重要一点是,即使没有更多维度需要填充,它也可以使用它,而其他答案却没有提到这一点。
例子:
>>> 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])
解决方案 5:
与 Numpy 一起使用时,Ellipsis
或...
允许人们编写适用于一维向量和高维数组的通用函数。
例如,假设我们要编写一个(故意简单的)函数,从数组的每一行中提取一组特定的元素
def fun(arr):
return arr[:, 1:4]
我们创建一个二维数组
>>> import numpy as np
>>> 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 包中广泛使用。
扫码咨询,免费领取项目管理大礼包!