与numpy操作混淆[:]和[...]

时间:2017-12-26 07:31:51

标签: python numpy

在numpy中,存在一些切片操作,如[1:3,3:5],但是我对操作a [:]和[...]感到困惑,我是python的新手,可以有谁解释这些之间的区别是什么?

2 个答案:

答案 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数组会使用它。