在numpy中,存在一些切片操作,如[1:3,3:5],但是我对操作a [:]和[...]感到困惑,我是python的新手,可以有谁解释这些之间的区别是什么?
答案 0 :(得分:1)
...
是省略号,在纯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]])
在多维对象中,...
会根据需要多次插入:
以达到完整维度
答案 1 :(得分:1)
...
表示0或更多:
。它们本身在LHS上最有用(但是对于RHS使用,请参见Is there a canonical way of obtaining a 0D numpy subarray?)
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
数组会使用它。