在numpy中,存在一些切片操作,如[1:3,3:5],但是我对操作a [:]和[...]感到困惑,我是python的新手,任何人都可以解释什么是这些之间的区别?
...
是Ellipsis,在纯Python中它基本上是一个非运算符。它充当代码的占位符,例如:
while True:
...
在numpy中,它有一个类似的用途,它是do-not-slice运算符。由于numpy同时支持多个切片,因此这可能很有用。例如,要获取多维数据集的不同边缘:
In [1]: import numpy
In [2]: cube = numpy.arange(3**3).reshape(3, 3, 3)
In [3]: cube
Out[3]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
In [4]: cube[0, ..., 0]
Out[4]: array([0, 3, 6])
In [5]: cube[..., 0, 0]
Out[5]: array([ 0, 9, 18])
In [6]: cube[0, 0, ...]
Out[6]: array([0, 1, 2])
应该注意的是,在上述情况下,...
在功能上与:
相同,但对于多维对象可能有所不同:
In [7]: cube[..., 0]
Out[7]:
array([[ 0, 3, 6],
[ 9, 12, 15],
[18, 21, 24]])
In [8]: cube[:, 0]
Out[8]:
array([[ 0, 1, 2],
[ 9, 10, 11],
[18, 19, 20]])
在多维物体中,...
根据需要多次插入:
以达到完整尺寸
...
表示0或更多:
。它们本身对LHS最有用(但请参阅Is there a canonical way of obtaining a 0D numpy subarray?用于RHS使用)
arr[...] =1
为arr
的所有元素分配1。它适用于所有维度,包括0d数组。
arr[:] =1
适用于1d数组,因为尾随':'是自动添加的,更高维数组也是如此。它不适用于0d数组。
Python对象Ellipsis
https://docs.python.org/dev/library/constants.html#Ellipsis
解释器在生成索引操作时使用
a[...] # implemented as
a.__getitem__((Ellipsis,))
类似地,':'被转换为slice(None)
对象。
像列表这样的Python对象对Ellipsis
没有任何作用,但是numpy
数组确实使用它。