【问题标题】:How does numpy three dimensiona slicing and indexing and ellipsis work?numpy 三维切片和索引以及省略号如何工作?
【发布时间】:2017-03-25 18:42:27
【问题描述】:

我很难理解一些 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] 是什么意思?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    对于您的第一个问题,这意味着形状为 (2, 3, 1) 的 x 有 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 和 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 中取出第一个切片并逐行拉伸。

    【讨论】:

    • 非常感谢您的解释,它真的很有帮助
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-12
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多