1. 张量的创建方式
import torch
# 1.通过列表创建张量
t = torch.tensor([1, 2])
# 2.通过元组创建张量
torch.tensor((1, 2))
# 3.通过array创建张量
import numpy as np
x = np.array((1, 2))
torch.tensor(x)
2. 张量的类型
t.dtype
# 张量默认创建长整形int64
torch.tensor(np.array([1.1, 1.2])).dtype
# 输出为float64
torch.tensor([1.1, 1.2]).dtype
# 输出为float32
## 创建浮点型数组时,张量默认创建32位,而array默认为64位置
2.1 创建指定类型的张量
torch.tensor([1, 2], dtype=torch.int16)
2.2 创建复数
# 1是实部,2j是虚部
x = torch.tensor(1 + 2j)
3. 张量的维度及形变
3.1 查看张量维度
# 创建1维张量
t = torch.tensor([1, 2])
# 查看张量维度
t.ndim
t.shape
t.size()
3.2 0维张量
# 虽然只包含一个元素,但又不是单独的一个数
# t1是一个0维张量,而t2是一个1维张量
t1 = torch.tensor(1)
t2 = torch.tensor([1])
3.3 张量的解读方法
import numpy as np
a1 = np.array([[1, 2, 2], [1, 3, 3]])
a2 = np.array([[1, 2, 3], [4, 5, 6]])
# 创建一个高维数组
t3 = torch.tensor([a1, a2])
"""
tensor([[[1, 2, 2],
[1, 3, 3]],
[[1, 2, 3],
[4, 5, 6]]])
"""
# 输出其形状
t3.shape
"""
torch.Size([2, 2, 3])
"""
# 第一个2可以理解为张量t3包含两个子元素,(2, 3)可以理解为这两个子元素是二维的,且形状为2x3
3.4 拉平张量
# 将多维的张量准换为1xn的张量
t4 = t3.flatten()
6. 使用reshape进行任意变化
使用reshape时,若调用为 t.reshape(x, y, z,...),则 t.shape 得到的值即为(x, y, z,...)
4. 张量的索引、切片
4.1 张量的符号索引
import torch
import numpy as np
# 1.一维张量索引,基本格式遵循[start : end : step]
t1 = torch.arange(1, 11)
# tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 这样获取的是一个0维张量,不是单独的数,要转换为数字需使用item()方法
t1[0]
# tensor(1)
t1[1: 8] #左闭右开
# tensor([2, 3, 4, 5, 6, 7, 8])
t1[1: : 2]
# tensor([2, 4, 6, 8, 10])
t1[: 8 : 2]
# tensor([1, 3, 5, 7])
4.2 张量的函数索引
# 使用index_select(),通过指定index来对张量进行索引
indices = torch.tensor([1, 2])
x = torch.index_select(t1, 0, indices)
# 第二个参数代表索引的维度,由于t1只有一个维度,故而取值为0,表示在第一个维度上进行索引
4.3 tensor.view()
此方法会返回一个类似视图的结果,该结果和原张量对象共享一块数据存储空间,并且通过.view()方法,还可以改变对象结构,生成一个不同结构,但共享一个存储空间的张量。当然,共享一个存储空间,也就代表二者是”浅拷贝”的关系,修改其中一个,另一个也会同步进行更改。
4.4 chunk分块
当原张量不能均分时,chunk不会报错,会返回其他均分结果
4.5 split拆分函数
split所得对象也是一个视图
5. 张量的合并操作
张量的合并操作与列表的追加元素类似,可以拼接、堆叠
5.1 拼接函数cat
1.1 先初始化3个张量
1.2 分别按照行列进行拼接
1.3 拼接维度不一致将会出错
5.2 堆叠函数stack
注:堆叠要求张量的形状完全一致,要求比cat更高
5. 张量广播
广播特性允许允许不同形状的张量之间进行计算。
- 相同形状的张量计算本质也用到了广播特性。
- 不同形状的张量计算。
- 标量和任意形状的张量都可以运算。
- 不同形状的张量。
- 若二者在两个分量均不相同,但都有分量为1的情况,则可以广播;
- 若二者在两个分量中仅有一个不同,且不同的分量中有一个为1,则可以广播。