Pytorch学习笔记(三)——索引与切片

学习目标:

掌握Pytorch
路漫漫其修远兮,吾将上下而求索。


学习内容:

索引:
pytorch,默认从左往右开始索引,-1表示从右往左。
:表示都取
x:表示从x取到最后
:x 表示从开始取到x
x:y 表示从x取到y

#生成一个随机tensor,表示类似一个CNN的图片的输入数据,4表示这个batch一共有4张照片,而3表示图片的通道数为3(RGB),(28,28)表示图片的大小
a = torch.randn(4,3,28,28)
#基本索引
#第0张图片的shape
a[0].shape   #torch.Size([3, 28, 28])
#第0张图片的第0个通道的size
a[0,0].shape   #torch.Size([28, 28])
#第0张图片的第0个通道的第2行第4列的像素点的值
a[0,0,2,4]   #tensor(-0.9859)
#连续索引
#连续取两张图片(取第0张以及第1张图片,不包括第2张)
a[:2].shape  #torch.Size([2, 3, 28, 28])
#前两张图片上第1个通道的数据(所以通道数变为1)
a[:2,:1,:,:].shape
a[:2,:1].shape   #torch.Size([2, 1, 28, 28])
#从后面取(-1表示最后一个,从最后一个取到最后,也就是一个通道)
a[:2,-1:,:,:].shape  #torch.Size([2, 1, 28, 28])
#规则间隔索引
#在图片的矩阵进行隔行与隔列索引 0:28:2表示从0到28(不包括28),间隔数为2
a[:,:,0:28:2,0:28:2].shape
a[:,:,::2,::2].shape    #torch.Size([4, 3, 14, 14])

note: index_select()函数:
第一个参数表示对哪个维度进行操作;第二个参数是index(必须是tensor类型)

#不规则间隔索引
#对第0张与第2张图片进行操作
a.index_select(0,torch.tensor([0,2])).shape   #torch.Size([2, 3, 28, 28])
#选择两个通道
a.index_select(1,torch.tensor([1,2])).shape   #torch.Size([4, 2, 28, 28])
#只取8行
a.index_select(2,torch.arange(8)).shape   #torch.Size([4, 3, 8, 28])
#任意多维度索引
#全部
a[...].shape  #torch.Size([4, 3, 28, 28])
#第0张图片
a[0,...].shape   #torch.Size([3, 28, 28])
#第0张图片第1个通道
a[0,1,...].shape   #torch.Size([28, 28])

a[...,2].shape   #torch.Size([4, 3, 28])

note: .masked_select()会将筛选出来的元素打平(因为无法维护原来的shape),可以获取满足一些条件的值的位置索引,然后用这个索引去取出这些位置的元素。

#使用掩码索引
x = torch.randn(2,3)
# tensor([[ 1.0514, -0.3103,  0.9764],
#         [ 0.2071, -2.1070, -0.8053]])

mask = x.ge(0.5)#大于等于0.5的元素
# tensor([[ True, False,  True],
#         [False, False, False]])

z = torch.masked_select(x,mask)
#tensor([1.0514, 0.9764])
#take索引,基于目标Tensor的flatten形式下的,即摊平后的Tensor的索引。
a = torch.tensor([[4,3,5],[6,7,8]])
#把a打平编程torch.tensor([4,3,5,6,7,8]),再取出下表为0,2,5的值
torch.take(a,torch.tensor([0,2,5]))   #tensor([4, 5, 8])

总结:

继续加油。

你可能感兴趣的:(Pytorch学习,pytorch,学习,python)