Cat
对数据沿着某一维度进行拼接。cat后数据的总维数不变.
比如下面代码对两个2维tensor(分别为2*3,1*3)进行拼接,拼接完后变为3*3还是2维的tensor。
import torch
torch.manual_seed(1)
x = torch.randn(2,3)
y = torch.randn(1,3)
print(x,y)
结果:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2×3]
-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 1×3]
将两个tensor拼在一起:
torch.cat((x,y),0)
结果:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 3×3]
stack,增加新的维度进行堆叠
而stack则会增加新的维度。
如对两个1*2维的tensor在第0个维度上stack,则会变为2*1*2的tensor;在第1个维度上stack,则会变为1*2*2的tensor。
见代码:
a=torch.rand((1,2))
b=torch.rand((1,2))c=torch.stack((a,b),0)
c.size()
结果:
torch.Size([2, 1, 2])
换成维度1:
d=torch.stack((a,b),1)
d.size()
结果:
torch.Size([1, 2, 2])
transpose ,交换维度
代码:
torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
结果:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2×3]
将x的维度互换:
x.transpose(0,1)
结果:
0.6614 0.62130.2669 -0.45190.0617 -0.1661[torch.FloatTensor of size 3x2]
permute,适合多维数据,更灵活的transpose
permute是更灵活的transpose,可以灵活的对原数据的维度进行调换,而数据本身不变。
代码如下:
x = torch.randn(2,3,4)
print(x.size())
x_p = x.permute(1,0,2) # 将原来第1维变为0维,同理,0→1,2→2 print(x_p.size())
结果:
torch.Size([2, 3, 4])
torch.Size([3, 2, 4])
squeeze 和 unsqueeze
squeeze(dim_n)压缩,即去掉元素数量为1的dim_n维度。同理unsqueeze(dim_n),增加dim_n维度,元素数量为1。
上代码:
# 定义张量 import torch b = torch.Tensor(2,1) b.shape Out[28]: torch.Size([2, 1]) # 不加参数,去掉所有为元素个数为1的维度 b_ = b.squeeze() b_.shape Out[30]: torch.Size([2]) # 加上参数,去掉第一维的元素为1,不起作用,因为第一维有2个元素 b_ = b.squeeze(0) b_.shape Out[32]: torch.Size([2, 1]) # 这样就可以了 b_ = b.squeeze(1) b_.shape Out[34]: torch.Size([2]) # 增加一个维度 b_ = b.unsqueeze(2) b_.shape Out[36]: torch.Size([2, 1, 1])