张量的操作
1. 张量的操作:拼接、切分、索引和变换
1.1 张量拼接与切分
1.1.1 通过torch.cat不拓展维度拼接
1 | torch.cat(tensors, |
功能:将张量按维度dim进行拼接
- tensors: 张量序列
- dim : 要拼接的维度
1 | import torch |
1 | t: |
dim=0就纵向拼接,dim=1就横向拼接
1.1.2 通过torch.stack在新的维度上拼接
1 | torch.stack(tensors, |
功能:在新创建的维度dim上进行拼接
- tensors:张量序列
- dim :要拼接的维度
1 | import torch |
1 | t_stack: |
选择在第0维度stack,则把原来的0、1维度往后推至1、2维度,空出0维度用于拼接。
维度2就是第3个括号,维度0就是第一个括号
1.1.3 通过torch.chunk按维度平均切分
1 | torch.chunk(input, |
功能:将张量按维度dim进行平均切分
返回值:张量列表
注意事项:若不能整除,最后一份张量小于其他张量
- input: 要切分的张量
- chunks : 要切分的份数
- dim : 要切分的维度
1 | import torch |
1 | 第1个张量: |
在维度1上做均分,最后一份不能等分就会比其他的短,长度7做3均分,则7/3=2.333,向上取整则前两份为3,最后一份为7-3-3=1
1.1.4 通过torch.split按维度平均切分
1 | torch.split(tensor, |
功能:将张量按维度dim进行切分
返回值:张量列表
- tensor: 要切分的张量
- split_size_or_sections : 为int时,表示每一份的长度;为list时,按list元素切分
- dim : 要切分的维度
1 | import torch |
1 | 第1个张量: |
如果这里[2, 1, 2]的和不是恰好输入张量t在维度1的维数,就会报错
1.2 张量索引
1.2.1 通过torch.index_select索引数据
1 | torch.index_select(input, |
功能:在维度dim上,按index索引数据
返回值:依index索引数据拼接的张量
- input: 要索引的张量
- dim: 要索引的维度
- index : 要索引数据的序号
1 | import torch |
1 | t: |
idx的数据类型必须是torch.long
1.2.2 通过torch.masked_select索引数据
1 | torch.masked_select(input, |
功能:按mask中的True进行索引
返回值:一维张量
- input: 要索引的张量
- mask: 与input同形状的布尔类型张量
1 | import torch |
1 | t: |
注意:返回的是True位置的元素的一维张量
1.3 张量变换
1.3.1 通过torch.reshape改变张量的形状
1 | torch.reshape(input, shape) → Tensor |
功能:变换张量形状
注意事项:当张量在内存中是连续时,新张量与input共享数据内存,但是不会改变原张量形状
• input: 要变换的张量
• shape: 新张量的形状
1 | import torch |
1 | t:tensor([5, 4, 2, 6, 7, 3, 1, 0]) |
对比t.reshape((2, 4))
,其实是一模一样的。
1 | import torch |
1 | t:tensor([5, 1, 2, 6, 0, 3, 7, 4]) |
1 | t = torch.randperm(8) |
1 | t:tensor([5, 4, 2, 6, 7, 3, 1, 0]) |
-1表示这个维度的维数不用关心,是由其余维度自动确定的。上面代码中,维度1和维度2都是2,则可以自动计算出维度0的维数是2
1.3.2 通过torch.transpose交换张量两个维度
1 | torch.transpose(input, |
功能:交换张量的两个维度
- input: 要变换的张量
- dim0: 要交换的维度
- dim1: 要交换的维度
1 | import torch |
1 | t:tensor([[[0.7576, 0.2793, 0.4031, 0.7347], |
1.3.2 通过torch.t转置张量
1 | torch.t(input) → Tensor |
功能:2维张量转置,对矩阵而言,等价于
1 | torch.transpose(input, 0, 1) |
1 | import torch |
1 | t:tensor([[0.7576, 0.2793, 0.4031], |
1.3.3 通过torch.squeeze压缩张量维度
1 | torch.squeeze(input, dim=None, out=None) → Tensor |
功能:压缩长度为1的维度(轴)
- dim: 若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除;
1 | import torch |
1 | t = |
就是去除多余的括号,因为dim=1时,括号是多余的。比如[[3, 2]]这个的维度是(1, 2)那么其实和[3, 2]是没有区别的
1.3.4 通过torch.unsqueeze扩展张量维度
1 | torch.unsqueeze(input, dim) → Tensor |
功能:依据dim扩展维度
- dim: 扩展的维度
1 | import torch |
1 | t = |
就是加括号,加维度为1的没有用的括号。
2. 张量的数学运算
2.1 通过torch.add对两个张量相加
1 | torch.add(input, other, *, alpha=1, out=None) |
功能:逐元素计算out=input+alpha×other
- input: 第一个张量
- alpha: 乘项因子
- other: 第二个张量
1 | import torch |
1 | t_0: |
(input, other, *, alpha=1, out=None)的$ * *$后面的参数只能用关键字传参
例外如果见到/,则表示/前面的参数只能用位置参数
2.2 通过torch.addcmul对张量加乘
1 | torch.addcmul(input, tensor1, tensor2, *, value=1, out=None) → Tensor |
- input (Tensor) – the tensor to be added
- tensor1 (Tensor) – the tensor to be multiplied
- tensor2 (Tensor) – the tensor to be multiplied
- value (Number*,* optional) – multiplier for tensor1. tensor 2
- out (Tensor, optional) – the output tensor.
1 | import torch |
1 | t_0: |
1 | import torch |
1 | t_0: |
如果value为浮点数,则参与运算的tensor必须都是浮点类型
2.3 其他函数
我就不写了,学会查看官方文档,非常方便而且详细。