导入torch
import torch
张量(Tensor)表示由一个数值组成的数组,这个数组可能具有多个维度,具有一个维度的数组是向量(vector),具有两个维度的数组是矩阵(matrix)…
arange创建一个行向量x
shape属性输出张量的形状
numel()张量中元素的个数
x = torch.arange(12)
print(x)
print(x.shape)
print(x.numel())
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
torch.Size([12])
12
reshape改变张量的形状而不改变元素数量和元素值,可以通过-1调用自动计算维度的功能
x = torch.reshape(x,(3,4))
print(x)
x = torch.reshape(x,(-1,4))
print(x)
x = x.reshape(3,-1)
print(x)
x = torch.reshape(x,(3,-1))
print(x)
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
torch.ones()输出全1张量
torch.zeros()输出全0张量
torch.randn()输出随机张量
print(torch.ones(1,3,4))
print(torch.zeros(1,3,4))
print(torch.randn(1,3,4))
tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
tensor([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
tensor([[[-0.7862, -0.3767, 1.6115, -0.5491],
[-1.2660, 1.5431, 2.0035, 1.0536],
[-0.9297, -1.4365, -0.1826, -0.2816]]])
自定义张量,最外层列表对应于轴0,内层的列表对应于轴1
print(torch.tensor([[1,2,3,4],[5,6,7,8],[9,0,1,2]]))
tensor([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 0, 1, 2]])
对任意具有相同形状的张量,常见的标准算数运算符(+、-、、/、**)都可升级为暗元素运算
x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
print(x+y)
print(x-y)
print(x*y)
print(x/y)
print(x**y)
print(torch.exp(x))
tensor([ 3., 4., 6., 10.])
tensor([-1., 0., 2., 6.])
tensor([ 2., 4., 8., 16.])
tensor([0.5000, 1.0000, 2.0000, 4.0000])
tensor([ 1., 4., 16., 64.])
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
张量连结
x = torch.arange(12,dtype=torch.float32).reshape((3,4))
y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[1,1,1,1]])
print(torch.cat((x,y),dim=0))
print(torch.cat((x,y),dim=1))
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 2., 1., 4., 3.],
[ 1., 2., 3., 4.],
[ 1., 1., 1., 1.]])
tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
[ 4., 5., 6., 7., 1., 2., 3., 4.],
[ 8., 9., 10., 11., 1., 1., 1., 1.]])
对张量中的所有元素求和,会产生一个单元素张量
x = torch.arange(12,dtype=torch.float32).reshape((3,4))
print(x.sum())
tensor(66.)
张量的广播机制:在某些情况下,张量形状不同,通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状,之后对生成的数组执行按元素操作。
x = torch.arange(3).reshape(3,1)
y = torch.arange(2).reshape(1,2)
print(x)
print(y)
print(x + y)
tensor([[0],
[1],
[2]])
tensor([[0, 1]])
tensor([[0, 1],
[1, 2],
[2, 3]])
张量中的元素可以通过索引访问,第一个元素的索引是0,最后一个元素的索引是-1,可以指定一定范围内的元素。
x = torch.arange(12).reshape(3,4)
print(x)
print(x[-1]) #最后一行元素
print(x[0]) #第一行元素
print(x[1:3]) #第二到三行元素
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([ 8, 9, 10, 11])
tensor([0, 1, 2, 3])
tensor([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
修改指定的元素值
x = torch.arange(12).reshape(3,4)
print(x)
x[1,2] = 0
print(x)
x[0:2,:] = 12 #访问第一行和第二行,:代表沿轴1(列)的所有元素
print(x)
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 0, 7],
[ 8, 9, 10, 11]])
tensor([[12, 12, 12, 12],
[12, 12, 12, 12],
[ 8, 9, 10, 11]])
将大小为1的张量转换为Python标量,调用item()函数
x = torch.tensor([2.2],dtype=torch.float32)
print(x)
print(x.item())
print(float(x))
print(int(x))
tensor([2.2000])
2.200000047683716
2.200000047683716
2
张量的条件语句按元素比较
x = torch.arange(12).reshape(3,4)
y = torch.ones(3,4)
print(x)
print(y)
print(x == y)
print(x > y)
print(x < y)
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
tensor([[False, True, False, False],
[False, False, False, False],
[False, False, False, False]])
tensor([[False, False, True, True],
[ True, True, True, True],
[ True, True, True, True]])
tensor([[ True, False, False, False],
[False, False, False, False],
[False, False, False, False]])