[英]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.