繁体   English   中英

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

[英]How does numpy three dimensiona slicing and indexing and ellipsis work?

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

第一个如下:

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

根据文档

如果选择元组中的对象数量小于 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, 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取出第一个切片并按行拉伸。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM