张量结构操作主要包括:张量创建,索引切片,维度变换,合并分割。
一、创建张量
张量创建的许多方法和numpy中创建array的方法很像。以下记录一些比较常用的操作:
(1)直接采用torch.tensor创建,指定数据类型为torch.float
(2)torch.arrage()函数
(3)torch.range()函数
(4)torch.linspace()
(5)torch.zeros()
(6)torch.ones() 和 torch.zeros_like()
(7)torch.fill_()
(8)正态随机分布
(8)特殊矩阵
二、索引切片
规则切片:
例如,采用均匀随机分布创建一个矩阵:
第0行:
倒数第一行:
第1行至第3行:
第1行至最后一行,第0列到最后一列每隔两列取一列:
可以使用索引和切片修改部分元素:
省略号可以表示多个冒号:
不规则切片:
以上切片方式相对规则,对于不规则的切片提取,可以使用torch.index_select, torch.take, torch.gather, torch.masked_select.
考虑班级成绩册的例子,有4个班级,每个班级5个学生,每个学生7门科目成绩。可以用一个4×5×7的张量来表示。
torch.floor()返回具有 input 元素下限的新张量,最大整数小于或等于每个元素。例如:
torch.index_select()
抽取每个班级第0个学生,第2个学生,第4个学生的全部成绩:
抽取每个班级第0个学生,第2个学生,第4个学生的第1门课程,第3门课程,第6门课程成绩
torch.take()
torch.masked_select()
以上这些方法仅能提取张量的部分元素值,但不能更改张量的部分元素值得到新的张量。
如果要通过修改张量的部分元素值得到新的张量,可以使用torch.where,torch.index_fill 和 torch.masked_fill
torch.where()
torch.where可以理解为if的张量版本
torch.index_fill()
torch.masked_fill()
三、维度变换
torch.view()
torch.reshape()
torch.reshape 可以改变张量的形状。
torch.squeeze()
如果张量在某个维度上只有一个元素,利用torch.squeeze可以消除这个维度。
torch.unsqueeze()
torch.unsqueeze的作用和torch.squeeze的作用相反。
torch.transpose()
torch.transpose可以交换张量的维度,torch.transpose常用于图片存储格式的变换上。
如果是二维的矩阵,通常会调用矩阵的转置方法 matrix.t(),等价于 torch.transpose(matrix,0,1)。
四、合并分割
可以用torch.cat方法和torch.stack方法将多个张量合并,可以用torch.split方法把一个张量分割成多个张量。
torch.cat和torch.stack有略微的区别,torch.cat是连接,不会增加维度,而torch.stack是堆叠,会增加维度。
torch.cat()
第0维:
第1维:
torch.stack()
第0维:
第1维:
torch.split()
torch.split是torch.cat的逆运算,可以指定分割份数平均分割,也可以通过指定每份的记录数量进行分割。
参考:https://github.com/lyhue1991/eat_pytorch_in_20_days