pytorch中张量的创建和维度的操作

张量的运算是深度学习的基本操作,深度学习框架的重要功能之一就是支持张量的定义与运算。

1. 张量的数据类型

数据 pytorch类型 CPU上的张量 GPU上的张量
32位浮点数 torch.float32
torch.float
torch.FloatTensor torch.cuda.FloatTensor
64位浮点数 torch.float64
torch.double
torch.DoubleTensor torch.cuda.DoubleTensor
16位浮点数 torch.float16
torch.half
torch.HalfTensor torch.cuda.HalfTensor
8位无符号整数 torch.uint8 torch.ByteTensor torch.cuda.ByteTensor
8位带符号整数 torch.int8 torch.CharTensor torch.cuda.CharTensor
16位带符号整数 torch.int16
torch.short
torch.ShortTensor torch.cuda.ShortTensor
32位带符号整数 torch.int32
torch.int
torch.IntTensor torch.cuda.IntTensor
64位带符号整数 torch.int64
torch.long
torch.LongTensor torch.cuda.LongTensor
布尔型 rorch.bool torch.BoolTensor torch.cuda.BoolTensor

2. python列表和numpy数组转为python张量

2.1 转换python列表为python张量

t = torch.tensor([1, 2, 3, 4], dtype=torch.float32)  # 列表转张量并指定张量数据类型
print(t)
print(t.dtype)  # 张量类型

在这里插入图片描述

2.2 转换numpy数组为python张量

arr = np.array([1, 2, 3, 4])
t = torch.tensor(t)
print(t)
print(t.dtype)

在这里插入图片描述

3. 张量的创建方式

3.1 通过torch.tensor函数创建张量

该方法类似于numpy中的array方法,可以指定数据类型。例子如2.1所示。

3.2 通过pytorch内置的函数创建张量

同样类似于numpy中的数据创建,可以指定张量形状或数据类型。

t1 = torch.rand(3, 3)  # 生成3x3的举证,矩阵元素服从[0, 1)上的均匀分布
print(t1)
print('=' * 50)
t2 = torch.randn(2, 3, 4)  # 生成2x3x4的张量,张量元素服从标准正太分布
print(t2)
print('=' * 50)
t3 = torch.zeros(2, 3)  # 生成2x3的张量,张量元素全为0
print(t3)
print('=' * 50)
t4 = torch.ones(2, 2)  # 生成2x2的张量,张量元素全为1
print(t4)
print('=' * 50)
t5 = torch.eye(2, 2)  # 生成2x2的单位矩阵
print(t5)
print('=' * 50)
t6 = torch.randint(0, 100, (3, 3))  # 生成0-100之间的均匀分布整数的3x3矩阵
print(t6)

pytorch中张量的创建和维度的操作_第1张图片

3.3 通过已知张量创建现状相同的张量

形状相同,但元素可能不一样。

t = torch.randn(3, 3)  # 生成一个随机正态分布的张量t
print(t)
t_like = torch.zeros_like(t)  # 生成一个元素全为0的张量,形状和给定张量t相同
print(t_like)

pytorch中张量的创建和维度的操作_第2张图片

3.4 通过已知张量创建形状不同但数据类型相同的张量

已知张量的数据类型,创建一个形状不同但数据类型相同的新张量。此方法较少使用

t = torch.rand(1, 3)  # 生成一个随机正态分布的张量t
print(t)
t_new = t.new_zeros(3, 3)  # 生成相同类型且元素全为0的张量
print(t_new)

pytorch中张量的创建和维度的操作_第3张图片

3. 和张量维度相关的方法

pytorch张量形状相关的一些函数。

t = torch.randn(3, 4, 5)  # 产生一个3x4x5的张量
print(t.ndimension())  # 获取维度的数目
print(t.nelement())  # 获取张量的总元素数目
print(t.size())  # 获取每个维度的大小,调用方法
print(t.shape)  # 获取张量每个维度的大小,访问属性
print('=' * 50)
t2 = torch.randn(12)
print(t2.view(3, 4))  # 改变向量形状为3x4的矩阵
print(t2.view(-1, 3))  # -1表示pytorch自动计算维度的具体值
print(t2.data_ptr())  # 获取张量的数据指针
print(t2.view(3, 4).transpose(0, 1).data_ptr())  # 交换两个维度的步长
print(t2.view(3, 4).transpose(0, 1).contiguous().data_ptr())  # 步长和维度不兼容,重新生成张量

pytorch中张量的创建和维度的操作_第4张图片

4. 张量的索引和切片

pytorch张量支持类似numpy的索引(Indexing)和切片(Slicing)操作。

t = torch.randn(3, 4, 5)
print(t)
print(t[1, 2, 3])  # 取张量在0维1号、1维2号和2维3号的元素(编号从0开始)
print(t[:, 1:-1, 2:4])  # :表示取所有,-1表示取最后一个元素
t[1, 2, 3] = 0.9999  # 直接更改张量的元素值
print(t > 0)  # 张量大于0部分的掩码
print(t[t>0])  # 根据掩码选出张量的元素,选出的是一个向量

pytorch中张量的创建和维度的操作_第5张图片
总结,pytorch的张量基本操作与numpy非常类似。

你可能感兴趣的:(PyTorch,pytorch,深度学习,python)