1 特殊张量的创建
与numpy
类似,PyTorch
中的张量也有很多特殊创建的形式。
zeros
:全0张量
# 形状为2行3列
torch.zeros([2, 3])
# tensor([[0., 0., 0.],
# [0., 0., 0.]])
ones
:全1张量
# 形状为2行3列
torch.ones([2, 3])
# tensor([[1., 1., 1.],
# [1., 1., 1.]])
eye
:单位矩阵
torch.eye(3)
# tensor([[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]])
diag
:对角矩阵
在PyTorch中,需要利用一维张量去创建对角矩阵。
torch.diag(torch.tensor([1,2,3,4,5]))
# tensor([[1, 0, 0, 0, 0],
# [0, 2, 0, 0, 0],
# [0, 0, 3, 0, 0],
# [0, 0, 0, 4, 0],
# [0, 0, 0, 0, 5]])
rand
:服从0-1均匀分布的张量
torch.rand(2, 3)
# tensor([[0.2154, 0.7666, 0.7396],
# [0.3063, 0.9024, 0.0047]])
randn
:服从标准正态分布的张量
torch.randn(3, 3)
# tensor([[ 1.2200, -1.0587, 1.0716],
# [-1.2465, -0.3391, 1.2131],
# [ 0.7201, 1.2034, -1.0660]])
normal
服从指定正态分布的张量
# 均值为2,标准差为3的张量,形状为2行2列
torch.normal(2, 3, size = (2, 2))
# tensor([[9.0815, 0.9216],
# [0.9856, 4.2866]])
randint
整数随机采用
torch.randint(1, 10, size = [2, 4])
# tensor([[1, 8, 2, 3],
# [5, 3, 5, 7]])
arange/linspace
:生成数列
# 从1-5,左闭右开
torch.arange(5)
# tensor([0, 1, 2, 3, 4])
# 从1-5,左右都包含,等距取3个数
torch.linspace(1, 5, 3)
# tensor([1., 3., 5.])
empty
:生成未初始化的指定形状矩阵
它生成的数近似于0,但不为0
torch.empty(2, 3)
# tensor([[-2.1193e-17, 4.5602e-41, 3.0720e-09],
# [ 3.0630e-41, 0.0000e+00, 0.0000e+00]])
full
:根据指定形状,填充指定数值
# 填充形状为2行4列,填充数值为2
torch.full([2, 4], 2)
# tensor([[2, 2, 2, 2],
# [2, 2, 2, 2]])
2 _like
后缀的用法
创建指定形状的数组,在上述函数后面加上_like
即可。比如现在我们有一个张量t
,形状为2行3列:
t = torch.tensor([[1, 2, 3], [4, 5, 6]])
我们想创建一个1-100随机数的张量,形状与张量t
相同:
torch.randint_like(t, 1, 100)
# tensor([[57, 67, 77],
# [76, 45, 31]])
上述函数都有_like
方法,需要注意的是该方法转化需要注意转化前后数据类型一致的问题,若数据类型不一致,则会报错:
# randn为float型,而t为int型
# 转换数据类型不一致,就会报错
torch.randn_like(t)
# RuntimeError
3 张量与其他数据类型的转换
张量、数组和列表是较为相似的三种类型对象,在实际操作过程中,经常会涉及三种对象的相互转化。
3.1 .numpy()/np.array()
:张量转化为数组
# 使用.numpy()
t.numpy()
# array([1, 2, 3])
# 使用np.array()
np.array(t)
# array([1, 2, 3])
3.2 tolist()/list()
:张量转化为列表
# 使用tolist()
t = torch.tensor([1, 2, 3])
t.tolist()
# [1, 2, 3]
需要注意的是,在使用list()时,此时转化的列表是由一个个零维张量构成的列表,而非张量的数值构成的列表。可理解为1维张量是由0维张量组成的。
# 使用list(),结果是零维张量构成的列表,为标量
list(t)
# [tensor(1), tensor(2), tensor(3)]
3.3 .item()
:标量转化为数值
在很多情况下,我们需要将最终计算的结果张量转为单独的数值进行输出。
n = torch.tensor(1)
print(n)
# tensor(1)
# 使用.item()方法将标量转为python中的数值
n.item()
# 1
4 张量的深拷贝
与python中其他对象类型一样,等号赋值操作实际上是浅拷贝,需要进行深拷贝,则需要使用clone方法。
4.1 浅拷贝
t1 = torch.arange(10)
t2 = t1
t2[1] = 10
print(t1)
# t1也被改变了
# tensor([ 0, 10, 2, 3, 4, 5, 6, 7, 8, 9])
print(t2)
# tensor([ 0, 10, 2, 3, 4, 5, 6, 7, 8, 9])
4.2 clone()
深拷贝
t1 = torch.arange(10)
t2 = t1.clone()
t2[1] = 10
# t1并没有被改变
print(t1)
# tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# t2的第二个元素变成了10
print(t2)
# tensor([ 0, 10, 2, 3, 4, 5, 6, 7, 8, 9])
Pytorch张量操作大全:
Pytorch使用教学1-Tensor的创建
Pytorch使用教学2-Tensor的维度
Pytorch使用教学3-特殊张量的创建与类型转化
Pytorch使用教学4-张量的索引
Pytorch使用教学5-视图view与reshape的区别
Pytorch使用教学6-张量的分割与合并
Pytorch使用教学7-张量的广播
Pytorch使用教学8-张量的科学运算
Pytorch使用教学9-张量的线性代数运算
Pytorch使用教学10-张量操作方法大总结