【发布时间】:2010-09-12 05:08:15
【问题描述】:
这出现在 Hidden features of Python 中,但我看不到很好的文档或示例来解释该功能的工作原理。
【问题讨论】:
标签: python numpy subclass slice ellipsis
这出现在 Hidden features of Python 中,但我看不到很好的文档或示例来解释该功能的工作原理。
【问题讨论】:
标签: python numpy subclass slice ellipsis
省略号在 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])
在您自己的实现中,您可以随意忽略上面提到的合同,并将其用于您认为合适的任何事情。
【讨论】:
a[:,:,:,0] 会返回一个副本,a[...,0] 会返回“视图”而不是副本吗?我尝试针对两个版本和 3 维数组运行 id():a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2] 都有不同的 id,而:a[..., 0], a[..., 1], a[..., 2] 都有相同的 id。
id() 为两者返回相同的值。还检查__array_interface__['data'] 显示相同的内存地址。
Ellipsis 或 ... 不是隐藏功能,它只是一个常数。它与作为语言语法一部分的 javascript ES6 完全不同。没有内置类或 Python 语言构造使用它。
因此,它的语法完全取决于您或其他人是否编写了代码来理解它。
Numpy 使用它,如 documentation 中所述。一些例子here。
在你自己的类中,你会这样使用它:
>>> 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 documentation 和language reference。但这些都不是很有帮助。
【讨论】:
这是省略号的另一种用途,它与切片无关:我经常在与队列的线程内通信中使用它,作为表示“完成”的标记;它在那里,它是一个对象,它是一个单例,它的名字的意思是“缺乏”,它不是过度使用的 None (可以作为正常数据流的一部分放入队列中)。 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
这将起作用:
a[...,0,:]
array([0, 1])
【讨论】: