目录

PyTorch的数据类型:Tensor

函数查找

一、Tensor的创建

二、Tensor的运算

三、Tensor的操作

四、NumPy 转换

一、Tensor的创建

二、Tensor的运算

2.1 张量元素比较

2.2 基本运算

2.2.1 逐元素加减乘除

2.2.2 幂运算

2.2.3 指数对数运算

2.2.4 平方根及其倒数

2.2.5 数据的裁剪

2.2.6 矩阵的运算

2.3 统计相关计算

2.4 其他的一些函数

三、Tensor的操作

(1)改变张量的形状

torch.reshape()

torch.resize_()

torch.unsqueeze()和torch.squeeze()

(2)获取张量中的元素

切片索引法

获取A中大于5的元素

筛选条件

上三角、下三角及对角线元素

(3)拼接与拆分

四、NumPy 转换

Torch Tensor转化为Numpy

Numpy转化为Torch Tensor


PyTorch的数据类型:Tensor

Tensor,即张量,它是PyTorch中基本的操作对象,简单的理解就是多维矩阵。Tensors与Numpy中的 ndarrays类似,但是在PyTorch中 Tensors 可以使用GPU进行计算。

函数查找

每个章节涉及的函数已经归纳在下方,可以随时查找用法。

一、Tensor的创建

torch.Tensor()torch.DoubleTensor()
torch.FloatTensor()torch.IntTensor()
torch.zeros()torch.ones()
torch.eye()torch.randn()
torch.empty()torch.randperm()
torch.**_like()
torch.ones_like()
torch.zeros_like()
torch.rand_like()
torch.range()
torch.full()

二、Tensor的运算

2.1 张量元素比较

torch.allclose()torch.eq()
torch.equal()torch.ge()
torch.gt()torch.le()
torch.lt()torch.ne()
torch.isnan()

2.2 基本运算

torch.pow()torch.exp()
torch.log()torch.sqrt()
torch.rsqrt()torch.clamp_max()
torch.clamp_min()torch.clamp()
torch.linspace()torch.matmul()
torch.t()torch.inverse()

2.3 统计相关计算

torch.max()torch.argmax()
torch.min()torch.argmin()
torch.mean()torch.sum()
torch.cumsum()torch.median()
torch.std()torch.cumprod()
torch.sort()torch.topk()
torch.kthvalue()

2.4 其他的一些函数

torch.abs()torch,div()
torch.add()torch.mm()
torch.mv()

三、Tensor的操作

(1)改变张量的形状

torch.reshape()A.resize_()
torch.squeeze()torch.unsqueeze()

(2)获取张量中的元素

torch.where()torch.tril()
torch.triu()torch.diag()

(3)拼接与拆分

torch.cat()torch.stack()
torch.chunk()torch.split()

四、NumPy 转换

torch.from_numpy()torch.numpy()

一、Tensor的创建

#创建指定大小torch.Tensor(3.2,2.4)#指定类型torch.DoubleTensor(3,2)torch.FloatTensor([2,3,4,5])torch.IntTensor(2,2)#列表生成torch.Tensor([1,2],[2,3])#0矩阵torch.zeros(3,2)#1矩阵torch.ones(3,2)#对角1矩阵torch.eye(2,2)#创建一个未被初始化数值的张量torch.empty(2,2)#随机张量torch.randn(2,2)#随机排列张量torch.randperm(5)#生成与D同样大小和类型的张量torch.**_like(D)    #比如:        torch.ones_like(D)        torch.zeros_like(D)        torch.rand_like(D)          #——与torch.randn一样生成的是标准正态分布的随机张量#生成某一范围的张量torch.range(1,20,2)    #起始——终止——步长#0.25全填充torch.full((3,3),fill_value=0.25)

二、Tensor的运算

2.1 张量元素比较

#比较两个元素是否接近torch.allclose()#逐元素比较是否相等torch.eq()#判断两个张量是否具有相同的形状和元素torch.equal()#逐元素比较大于等于torch.ge()#逐元素比较大于torch.gt()#逐元素比较小于等于torch.le()#逐元素比较小于torch.lt()#逐元素比较不等于torch.ne()#判断是否为缺失值torch.isnan()

在这里,只需要知道就可以了,如果有需要的时候可以翻书和查函数手册。

2.2 基本运算

张量的基本运算方式,一种是逐元素之间的运算,如加减乘除、幂运算、平方根、对数、数据裁剪等;另一种为矩阵之间的运算,如矩阵相乘、矩阵的转置、矩阵的迹等。

2.2.1 逐元素加减乘除

import torchA=torch.arange(6.0).reshape(2,3)B=torch.linspace(10,20,steps=6).reshape(2,3)print("A:",A)print("B:",B)C=A+Bprint("逐元素相加:",C)D=A-Bprint("逐元素相减:",D)E=A*Bprint("逐元素相乘:",E)F=B//Aprint("逐元素整除:",F)
A: tensor([[0., 1., 2.],        [3., 4., 5.]])B: tensor([[10., 12., 14.],        [16., 18., 20.]])逐元素相加: tensor([[10., 13., 16.],        [19., 22., 25.]])逐元素相减: tensor([[-10., -11., -12.],        [-13., -14., -15.]])逐元素相乘: tensor([[  0.,  12.,  28.],        [ 48.,  72., 100.]])逐元素整除: tensor([[inf, 12.,  7.],        [ 5.,  4.,  4.]])

2.2.2 幂运算

计算张量的幂可以使用torch.pow(),或者**运算

print(torch.pow(A,3))print(A**3)
tensor([[  0.,   1.,   8.],        [ 27.,  64., 125.]])tensor([[  0.,   1.,   8.],        [ 27.,  64., 125.]])

2.2.3 指数对数运算

#计算张量的指数torch.exp(A)#计算张量的对数torch.log(A)
tensor([[  1.0000,   2.7183,   7.3891],        [ 20.0855,  54.5981, 148.4132]])
tensor([[  -inf, 0.0000, 0.6931],        [1.0986, 1.3863, 1.6094]])

2.2.4 平方根及其倒数

#计算张量的平方根print(torch.sqrt(A))print(A**0.5)#计算张量的平方根倒数print(torch.rsqrt(A))print(1 / (A**0.5))
tensor([[0.0000, 1.0000, 1.4142],        [1.7321, 2.0000, 2.2361]])tensor([[0.0000, 1.0000, 1.4142],        [1.7321, 2.0000, 2.2361]])tensor([[   inf, 1.0000, 0.7071],        [0.5774, 0.5000, 0.4472]])tensor([[   inf, 1.0000, 0.7071],        [0.5774, 0.5000, 0.4472]])

2.2.5 数据的裁剪

#根据最大值裁剪print(torch.clamp_max(A,4))#根据最小值裁剪print(torch.clamp_min(A,3))#根据范围裁剪print(torch.clamp(A,2.5,4))
tensor([[0., 1., 2.],        [3., 4., 4.]])tensor([[3., 3., 3.],        [3., 4., 5.]])tensor([[2.5000, 2.5000, 2.5000],        [3.0000, 4.0000, 4.0000]])

2.2.6 矩阵的运算

#矩阵的转置C=torch.t(A)print("矩阵的转置",C)#矩阵相乘,A的行数要等于C的列数print("矩阵相乘",A.matmul(C))
矩阵的转置 tensor([[0., 3.],        [1., 4.],        [2., 5.]])矩阵相乘 tensor([[ 5., 14.],        [14., 50.]])

若A xB = I,I为单位矩阵,则可称A和B互为逆矩阵;一个方阵中,对角线元素的和称为矩阵的迹。

C=torch.rand(3,3)#矩阵的逆D=torch.inverse(C)print("C:",C,"\n","D:",D)#矩阵的迹torch.trace(torch.arange(9.0).reshape(3,3))
C: tensor([[0.9020, 0.8445, 0.5127],        [0.4689, 0.5106, 0.8877],        [0.7195, 0.3104, 0.5277]])  D: tensor([[-0.0288, -1.3566,  2.3101],        [ 1.8526,  0.5072, -2.6532],        [-1.0505,  1.5515,  0.3060]])

tensor(12.)

2.3 统计相关计算

#计算张量中的最大值torch.max()#计算张量中的最大值位置torch.argmax()#计算张量中的最小值torch.min()#计算张量中的最小值位置torch.argmin()
  1. torch.mean() #指定维度计算平均值
  2. torch.sum() #指定维度求和
  3. torch.cumsum() #指定维度进行累加和
  4. torch.median() #指定维度求中位数
  5. torch.cumprod() #指定维度计算累乘积
  6. torch.std() #张量标准差
#张量排序,分别输出从小到大,与原来对应索引位A=torch.tensor([12,34,25,11,67,32,29,30,99,55,23,44])torch.sort(A)
torch.return_types.sort(values=tensor([11, 12, 23, 25, 29, 30, 32, 34, 44, 55, 67, 99]),indices=tensor([ 3,  0, 10,  2,  6,  7,  5,  1, 11,  9,  4,  8]))
#降序排列torch.sort(A,descending=True)
torch.return_types.sort(values=tensor([99, 67, 55, 44, 34, 32, 30, 29, 25, 23, 12, 11]),indices=tensor([ 8,  4,  9, 11,  1,  5,  7,  6,  2, 10,  0,  3]))
#获取张量前几个大的数值以及索引torch.topk(A,4)
torch.return_types.topk(values=tensor([99, 67, 55, 44]),indices=tensor([ 8,  4,  9, 11]))
#获取张量第k小的数值和位置torch.kthvalue(A,3)
torch.return_types.kthvalue(values=tensor(23),indices=tensor(10))

2.4 其他的一些函数

  • torch.abs:返回输入参数的绝对值
  • torch.add:用于返回张量与张量或张量与标量的和的Tensor
  • torch,div:返回输入参数求商的结果,可以是Tensor与Tensor,Tensor与标量
  • torch.mm:矩阵的相乘
  • torch.mv:返回输入参数的求积结果作为输出,按照矩阵与向量之间的乘法规则,第一个参数为矩阵,第二个参数为向量,不能颠倒

三、Tensor的操作

(1)改变张量的形状

torch.reshape()

A=torch.arange(12).reshape(3,4)
tensor([[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]])

对于已经生成的可以采用下面的方式

torch.reshape(input=A,shape=(2,-1))

torch.resize_()

A.resize_(2,6)
tensor([[ 0,  1,  2,  3,  4,  5],        [ 6,  7,  8,  9, 10, 11]])

还提供了A.resize_as_(B),可以将A的形状设置为与B相同的形状大小。

torch.unsqueeze()和torch.squeeze()

  • torch.unsqueeze()函数在指定维度插入尺寸为1的新张量
  • torch.squeeze()函数移除所有维度为1的维度
A=torch.arange(12).reshape(2,6)B=torch.unsqueeze(A,dim=0)print("B.shape",B.shape)C=B.unsqueeze(dim=3)print("C.shape",C.shape)D=torch.squeeze(C)print("D.shape",D.shape)#移除指定维度为1的维度E=torch.squeeze(C,dim=0)print("E.shape",E.shape)
B.shape torch.Size([1, 2, 6])C.shape torch.Size([1, 2, 6, 1])D.shape torch.Size([2, 6])E.shape torch.Size([2, 6, 1])

(2)获取张量中的元素

切片索引法

import torchA=torch.arange(12).reshape(1,3,4)print(A)print("0维度",A[0])print("获取0维度下的矩阵前两行元素\n",A[0,0:2,:])print("获取0维度下最后一行的-4至-1列\n",A[0,-1,-4:-1])
tensor([[[ 0,  1,  2,  3],         [ 4,  5,  6,  7],         [ 8,  9, 10, 11]]])0维度 tensor([[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]])获取0维度下的矩阵前两行元素 tensor([[0, 1, 2, 3],        [4, 5, 6, 7]])获取0维度下最后一行的-4至-1列 tensor([ 8,  9, 10])

获取A中大于5的元素

A[A>5]
tensor([ 6,  7,  8,  9, 10, 11])

筛选条件

B=-Atorch.where(A>5,A,B) #当A>5时为True,返回A的值,否则会返回B的值
tensor([[[ 0, -1, -2, -3],         [-4, -5,  6,  7],         [ 8,  9, 10, 11]]])

上三角、下三角及对角线元素

#获取矩阵下三角print(torch.tril(A,diagonal=0))#diagonal控制要考虑的对角线print(torch.tril(A,diagonal=-1))#获取上三角print(torch.triu(A,diagonal=0))#获取对角线元素C=A.reshape(3,4)print(torch.diag(C,diagonal=0))print(torch.diag(C,diagonal=-1))
tensor([[[ 0,  0,  0,  0],         [ 4,  5,  0,  0],         [ 8,  9, 10,  0]]])tensor([[[0, 0, 0, 0],         [4, 0, 0, 0],         [8, 9, 0, 0]]])tensor([[[ 0,  1,  2,  3],         [ 0,  5,  6,  7],         [ 0,  0, 10, 11]]])tensor([ 0,  5, 10])tensor([4, 9])

(3)拼接与拆分

A=torch.arange(6.0).reshape(2,3)B=torch.linspace(0,10,6).reshape(2,3)#在0维度连接张量C=torch.cat((A,B),dim=0)C
tensor([[ 0.,  1.,  2.],        [ 3.,  4.,  5.],        [ 0.,  2.,  4.],        [ 6.,  8., 10.]])
  • torch.stack(),可以将多个张量按照指定的维度进行拼接
  • torch.chunk(),可以将张量分割为特定数量的块
  • torch.split(),将张量分割为特定数量的块,可以指定每个块的大小

四、NumPy 转换

将一个Torch Tensor转化为Numpy数组是一件轻松的事,反之亦然。

Torch Tensor与Numpy数组共享底层内存地址,修改一个会导致另一个的变化。

Torch Tensor转化为Numpy

a=torch.ones(5)print(a)b=a.numpy()print("ndarray",b)
tensor([1., 1., 1., 1., 1.])
ndarray [1. 1. 1. 1. 1.]

Numpy转化为Torch Tensor

a=numpy.ones(5)b=torch.from_numpy(a)print("n:",a)print("t:",b)

n: [1. 1. 1. 1. 1.]

t: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)