最近在学习pytorch,对于索引这一块,总是感觉有点晕,经过自己的一番探索,将自己的理解分享一下。如有不对,请大神们不惜赐教,欢迎随时纠正。
先区分一下索引和切片
从概念的角度讲:
索引:提取其中的某个元素(对座查找)
切片:用刀来切出要留下的东西
从操作的角度看:
import torch as t
以二维数据为例子
a=t.arange(16).view(4, 4)
# a =
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
索引:
a[1,2] #提取一个数,一定要在两个维度上都有数据
a[[1,1,1],2]#两个维度长度不一致,自动补全
a[[1,1,1],[2,2,2] #与上面等同
如果出现每个维度上的数据不全,那么会自动补全,当然补全操作就是只是该维度上的所有。
a[1], 自动补全为a[1, :],
a[:, 1], 逗号前端东西不能省略()
这就成为了切片操作
所以切片操作也是索引的一个子集,但是切片操作中必定有:操作符
所以看一下不同:
>>> a[1,1]
tensor(5) #
>>> a[1:2, 1:2]
tensor([[5]]) #
>>> a[1:2, 1]
tensor([5]) #
>>> a[1, 1:2]
tensor([5])#
>>> a[1,1].shape
torch.Size([])
>>> a[1,1:2].shape
torch.Size([1])
>>> a[1:2,1:2].shape
torch.Size([1, 1])
|