导入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]])