numpy三维切片和索引以及省略号如何工作?

时间:2017-03-25 18:42:27

标签: python arrays numpy

我很难理解一些numpy的切片和索引是如何工作的

第一个是以下内容:

>>> x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> x.shape
(2, 3, 1)
>>> x[1:2]
array([[[4],
        [5],
        [6]]])

根据documentation

  

如果选择元组中的对象数小于N,则   :假定任何后续维度。

那么这意味着[[1], [2], [3]] , [[4], [5], [6]]本身是一个2x3数组吗?

怎么做

x[1:2]

返回

array([[[4],
        [5],
        [6]]])

第二个是省略号

>>> x[...,0]
array([[1, 2, 3],
       [4, 5, 6]])
  

省略号扩展为:进行选择所需的对象数量   与x.ndim长度相同的元组。可能只有一个   省略号存在。

为什么[...,0]意味着什么?

2 个答案:

答案 0 :(得分:1)

对于您的第一个问题,这意味着x形状(2,3,1)有2个3x1数组切片。

In [40]: x
Out[40]: 
array([[[1],
        [2],          # <= slice 1 of shape 3x1
        [3]],

       [[4],
        [5],          # <= slice 2 of shape 3x1
        [6]]])

现在,当您执行x[1:2]时,它只会将您移到第一个切片上但不包括第二个切片,因为在Python&amp; NumPy它始终保持包容性和正确的排他性(类似半开区间,即[1,2])

In [42]: x[1:2]
Out[42]: 
array([[[4],
        [5],
        [6]]])

这就是你得到第一片的原因。

关于第二个问题,

In [45]: x.ndim
Out[45]: 3

因此,当您使用省略号时,它只会将数组拉伸到3号。

In [47]: x[...,0]
Out[47]: 
array([[1, 2, 3],
       [4, 5, 6]])

上面的代码意味着,您从数组x中获取两个切片,然后逐行拉伸。

但相反,如果你这样做

In [49]: x[0, ..., 0]
Out[49]: array([1, 2, 3])

在这里,您只需从x获取第一个切片并按行拉伸。

答案 1 :(得分:0)

现在,当您执行x [1:2]时,它只会将您交给第一个切片

我的问题是不是应该第二片。由于输出是切片2

In [42]: x[1:2]
Out[42]: 
array([[[4],
        [5],
        [6]]])