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

2025-02-28 08:22:00
admin
原创
54
摘要:问题描述:这出现在 Python 的隐藏功能中,但我看不到很好的文档或示例来解释该功能如何工作。解决方案 1:省略号在 numpy 中用于切分高维数据结构。它的设计意思是,此时插入尽可能多的完整切片(:)以将多维切片扩展到所有维度。例子:>>> from numpy import arang...

问题描述:

这出现在 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 包中广泛使用。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用