张量的索引、分片、合并以及维度调整
1、索引
张量的索引从维度出发,几个维度就写几个索引。
1.1、符号索引
pytorch中的索引基本遵循python的写法,[start: end: step],下面以一个三维张量为例:
import torch
t = torch.arange(12).reshape(2,2,3)
t
高维张量的理解:t 是一个3维张量,由2个二维张量构成,这两个二维张量都是由4个一维张量构成,每个一维张量都是由5个0维张量构成。
t[1,1,1]
上述表明,在第一个维度取第二个位置,第二个维度也取第二个位置,第三个维度同样如此,通俗来讲就是,索引张量t的第二个二维张量的第二行的第二列。就是零维张量tensor(10)
t[::2,::2,::2]
在第一个维度从第一个元素步长为2取,在第二个维度以步长为2取,在第三个维度以步长为2取。故索引为t的第一个二维张量的第一行的第一列和第3列。
一维张量和二维张量就不谈了,类似处理即可。
1.2、函数索引
除了符号可以索引外,pytorch还提供了一些函数来进行索引
index = torch.tensor([0,1])
torch.index_select(t,2,index)
有 3 个参数,第一个时输入的tensor,第二个是维度,第三个是一个列表但是必须用张量表示即一维张量,这个函数索引太不方便了,直接使用符号索引即可,上述结果表明索引t的第3个维度即列,每个2维变量的每一行的第一列和第二列
t[:,:,0:2]
2 、切片
2.1 view()视图
torch.view()
该方法返回一个视图,占用的内存小,随着原始张量的改变而改变。
2.2、分片chunk函数
均分函数chunk
torch.chunk(t,3,dim=2)
在第三个维度上对张量t进行3等分
torch.chunk(t,4,dim=2)
如果不能均分,chunk函数会自动向下补齐,4不行就3,3不行就 2,直至能均分为止。
2.3、split函数
split函数既能均分也能自定义分
torch.split(t,[1,2],2)
在第三个维度上对张量t按照【1:2】的比例分片
torch.split(t,[1,1,1],2)
在第三个维度上对张量t按照【1:1:1】的比例分片
3、张量的合并
3.1、拼接函数cat
a = torch.zeros(2,3)
b = torch.ones(2,3)
torch.cat([a,b]) #dim默认取0
torch.cat([a,b],dim=1)
注:shape不一样时会报错
c = torch.ones(3,2)
torch.cat([a,c])
3.2、堆叠函数stack
torch.stack([a,b])
a和b分别是维度相同的二维张量,stack函数将二者堆叠形成了一个3维张量,这就是cat和stack的区别。
4 、维度的变换
上一节记录了reshaoe方法改变了张量的维度,这里介绍两个函数,squeeze函数(降维)和unsqueeze(升维)函数
比较好理解。删除不必要的维度,升一个不必要的维度
a = torch.arange(12)
a
此时a是一个一维张量由12个零维张量构成
b =torch.unsqueeze(a,dim=0) #在第一个维度处升维
b
c = torch.unsqueeze(b,dim =2)
c
经过两次升维,此时张量c是一个3维张量
torch,squeeze(c)
squeeze函数去掉不必要的维度后又变成一维张量了。