我很难理解一些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]
意味着什么?
答案 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]]])