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

问题描述 投票:1回答:2

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

python numpy
2个回答
1
投票

...是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]])

在多维物体中,...根据需要多次插入:以达到完整尺寸


1
投票

...表示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数组确实使用它。

© www.soinside.com 2019 - 2024. All rights reserved.