1、基本操作
import numpy as np
import torch
obj = torch.Tensor(3,4)
#1.判断是否是Tensor
torch.is_tensor(obj) # isinstance(obj,torch.Tensor)
#2.全局设置Tensor类型
torch.set_default_tensor_type(torch.DoubleTensor) #torch.Tensor(2).dtype : torch.float64
#3.获取Tensor元素个数
torch.numel(obj)
#4.与numpy互相转换
def array2tensor(array):
return torch.from_numpy(array)
def tensor2array(tensor):
return tensor.numpy()
#5.创建tensor ,基本同numpy
torch.zeros(2,2)
torch.eye(3,3)#单位矩阵
torch.arange(1,12,3)#step=3 1,4,7,10
torch.linspace(1,9,5,requires_grad=True)# start/end/nums 等差数列
torch.logspace(1,9,5,requires_grad=True)#10^1 - 10^9 nums = 5
torch.ones(2,5)#元素为1的矩阵
torch,rand(2,3)#均匀分布随机矩阵
torch.randn(2,3)#标准正态分布随机矩阵
torch.randperm(10)#numpy.random.permutation(10) 随机整数序列
tensor([1., 3., 5., 7., 9.], requires_grad=True)
2、索引、切片、连接和换位
#1.维度拼接
ensor = torch.ones(2,3)
#cat拼接,以dim进行拼接,dim = [0 , dims)
print(torch.cat([ensor,ensor,ensor],dim = 0).size() )
#stack拼接,叠加
print(torch.stack([ensor,ensor],dim = 2).size() )
#2.分片, chunk,按维度分片
x = torch.ones(5,10)
torch.chunk(x,5,dim=0)# 5个1*10; dim=2 五个2*2
#3.按条件筛选出元素
torch.index_select(x,1,torch.LongTensor([0,1]))#按索引返回元素,输入、维度、索引
x = torch.rand(2,4)
mask = x.ge(0.5) #返回x规格的bool类型的tensor,大于0.5为1,小于等于为0
torch.masked_select(x,mask)#保留mask中为1的元素
torch.nonzero(x) # == x.get(0)
#4.维度改变
print(x.shape)
print (x.unsqueeze(dim=0).size())
print (x.unsqueeze(dim=1).size())
print (x.unsqueeze(dim=1).squeeze(dim=0).size())#去掉dim=0且其维度为1;不要参数,自动去除为1的维度
#5.转置
print( x.shape)
print( torch.t(x).shape ) #x.t()
print( torch.transpose(x,0,1).shape)#x.transpose(1,0)
torch.Size([6, 3])
torch.Size([2, 3, 2])
torch.Size([2, 4])
torch.Size([1, 2, 4])
torch.Size([2, 1, 4])
torch.Size([2, 1, 4])
torch.Size([2, 4])
torch.Size([4, 2])
torch.Size([2, 4])
3、元素数学计算
±/和基本四则运算一致,运算的矩阵的size要一致
绝对值: torch.abs(x)
求和: torch.add(t1,t2)
余弦: torch.cos(x)
反余弦: torch.acos(x)
相乘再相加: torch.addcmul(a,0.1,t1,t2) = a + 0.1t1t2
相除再相加: torch.addcdiv(a,0.1,t1,t2) = a + 0.1t1/t2
范围限制(夹逼函数): torch.clamp(x, a,b) 大于a的设置为a,小于b的设置为b
乘法: torch.mul(t1,t2) = t1*t2
除法: torch.div(t1,t2) = t1/t2
取相反数: torch.neg(x)
取倒数: torch.reciprocal(x)
取平方根: torch.sqrt()
取余数: torch.fmod(x,3) = torch.remainder(x,3) = x%3
取小数部分: torch.frac(x)
四舍五入: torch.round(x)
向上取整: torch.ceil(x)
向下取整: torch.floor(x)
e指数运算: torch.exp(x)
e对数运算: torch.log(x) 还有 torch.log2(x) torch.log10(x)
幂运算: torch.pow(x,n)
Sigmoid函数: torch.sigmoid(x)
符号(sign)函数: torch.sign(x)
4、规约计算
计算元素的和: torch.sum(x,dim=0) ,去掉dim参数就是默认整体求
计算元素的乘积: torch.prod(x)
累加: torch.cumsum(x,dim=n) 返回相同size的Tensor,其中每个元素值为按方向下的累加结果
累积: torch.cumprod(x,dim=n)
p-norm距离,采用p范数:
曼哈顿距离(1): torch.dist(x,y,p=1)
欧式距离(2): torch.dist(x,y,p=2)
无穷范数: torch.dist(x,y,p=np.inf)
p-norm范数: torch.norm(x,p=1,dim=0)
均值: torch.mean(x)
中位数: torch.median(x) 制定dim会返回两个Tensor,第一个是中位数,第二个是索引
众数: torch.mode(x)
方差: torch.var(x)
标准差: torch.std(x)
print(x)
print(torch.cumsum(x,dim=1))#累加
torch.sum(x)
tensor([[0.2482, 0.8132, 0.5901, 0.0254],
[0.0543, 0.4632, 0.7734, 0.9272]])
tensor([[0.2482, 1.0615, 1.6516, 1.6770],
[0.0543, 0.5175, 1.2909, 2.2181]])
tensor(3.8951)
5、数值比较计算
比较元素是否相等: torch.eq(t1,t2) 返回bool-tensor
比较元素是否大于后者: torch.gt(t1,t2)
比较元素是否大于等于后者: torch.ge(t1,t2)
比较Tensor是否相等: torch.equal(t1,t2) 返回true or False
最大\小值: torch.max(x) torch.min(x)
排序: torch.sort(x,dim=0,descending=True) #降序,默认无参数为升序 ;返回两个Tensor,第一个为sorted,第二个为原始的
返回最大/小的k个元素: torch.topk(x,k=2,largest=False)
a = torch.Tensor([0,2,3,5,1,2])
torch.sort(a,dim=0,descending=True)
torch.return_types.sort(
values=tensor([5., 3., 2., 2., 1., 0.]),
indices=tensor([3, 2, 1, 5, 4, 0]))
6、矩阵运算
x = torch.rand(3)
对角矩阵: torch.diag(x, diagonal = 0) diagonal对角线偏移量,0主,>0上偏,<0下偏
下三角矩阵: torch.tril(x , diagonal = 0)
上三角矩阵: torch.triu(x)
矩阵的迹: torch.trace(x)
矩阵乘积: torch.bmm(A,B) torch.mm(A,B) #矩阵A的列数需要等于B的行数
两个一维向量的点积(元素相乘再相加): torch.dot(x,y)
批量相乘再相加: torch.addbmm(x,batch1,batch2,beta=0.1,alpha=10) #betax + b1.b2alpha
矩阵乘向量再相加: torch.addmv(x,mat,vec,beta=0.1,alpha=10) #betax + (mat.*vec)*alpha
特征值及特征向量:
torch.eig(x,eigenvectors=True) #eigenvectors为True,同时计算特征值与特征向量;否则只计算值