【小贪】深度学习常用Pytorch, Numpy对比及常用语法

近期致力于总结科研或者工作中用到的主要技术栈,从技术原理到常用语法,这次查缺补漏当作我的小百科。主要技术包括:

以下整理错误或者缺少的部分欢迎指正!!!

1. 简介

Torch的tensor可以在GPU上加速运算,Numpy的ndarray只能在CPU上加速运算。

导包与相互转化

import numpy as np
import torch
import torch.nn.functional as f

np_data = np.arange(9).reshape(3,3)
torch_data = torch.from_numpy(np_data).cuda()
tensor2array = torch_data.cpu().detach().numpy()

2. 相同语法

功能函数
查看矩阵行数len(x)
取出矩阵x的k对角元素np/torch.diag(x, k)
取出矩阵x的下三k角矩阵np/torch.tril(x, k)
取出矩阵x的上三k角矩阵np/torch.triu(x, k)
指定范围,指定步长,生成等差数列np/torch.arange(start, end, step)
指定范围,指定生成个数,生成等差数列np/torch.linspace(strat, end, num)
指定范围,指定生成个数,对数均分np/torch.logspace(strat, end, num)
``
矩阵加法np/torch.add(x1, x2)
矩阵减法np/torch.substact(x1, x2)
矩阵除法np/torch.divide(x1, x2)
取指数/对数np/torch.exp/log(x)
取平方np/torch.sqrt(x)
转置x.T
矩阵伪逆np/torch.linalg.pinv(x)
``
求累加和np/torch.cumsum(x)
求最值及其索引np/torch.max/min/argmax/argmin/abs(x, axis/dim)
统计函数np/torch.mean/median/sum(x, axis/dim)
沿着某一维度计算相邻元素的差np/torch.diff(x, axis/dim)
判断是否为inf/有穷np/torch.isinf/isfinite(x)
指定维度上布尔值有/全真np/torch.any(x, axis/dim)
条件函数np/torch.where(condition, true_value, false_value)
返回满足条件的索引np/torch.where(condition)[0]
x1是否在x2中np/torch.isin(x1, x2)
元素去重np/torch.unique(x, axis/dim) 获得去重后的一维矩阵
``
*修改维度(增大补0,变小删除)np/torch.resize(x, size/shape)
*修改维度(前后元素数相同,不改变原数组及元素顺序)np/torch.reshape(x, size/shape)
*去除某一为1的维度np/torch.squeeze(x, axis/dim)
*指定增加某一维度np.unsqueeze(x, axis/dim)
移动维度np/torch.moveaxis(x, source, destination)
指定维度直接拼接np.concatenate((x1, x2, ...), axis/dim) torch可以写为cat
指定维度新建一维拼接np/torch.stack((x1, x2, ...), axis/dim)
指定维度拼接np/torch.hstack/vstack/dstack((x1, x2, ...))
矩阵分割np/torch.split(x, indices_or_sections/split_size_or_sections)
指定维度分割np/torch.hsplit/vsplit/dsplit(x)

以上标*的也可以使用ndarray/tensor.resize()等。

3. 专属语法

功能函数
原地打乱顺序np.random.shuffle(x)
非原地打乱顺序np.random.permutation(x)
对x保留d位小数,后面的四舍五入np.round(x, d)
求协方差矩阵np.corrcoef(x)
布尔操作np.logical_and/or(x1, x2)
删除指定位置/布尔索引的元素np.delete(x, index/bool_index)
指定增加某一维度np.expand_dims(x, axis=None)
指定维度逐元素重复x.repeat(axis, repeats)
``
求平方根倒数torch.rsqrt()
获得最大的k个元素x.topk(k, dim)
某一维度上最小的第k个x.kthvalue(k, dim)
组合计算f.log_softmax(x) 先sf再log
组合计算torch.logsumexp(x) 先e再sum再log
对x在维度0上逆序torch.flip(x, dims=[0])
维度变换x.view(shape) 类似reshape,与原tensor共享内存
维度扩大x.expand(shape) 维度变为shape的维度
张量切割torch.chunk(x, chunks, dim) 切割为指定chunks数量的张量块
获取maskx.ge(0.5) ge>,le<,gt>=,lt<=,eq=
根据mask筛选torch.masked_select(x, x.le(20))

4. 不同语法对比

矩阵创建

numpytorch
基础变量np.array(data, dtype=None)torch.tenosr(data, dtype=None, device=None, requires_grad=False)
全0/1矩阵np.zeros/ones((3, 4))torch.zeros/ones(3, 4)
全值矩阵np.full(size, value)torch.full(shape, value)
未初始化矩阵np.empty(size)torch.empty(shape)
N维单位矩阵np.identity/eye(N)torch.eye(N)
随机整数np.random.randint(low, high, size)torch.empty(shape).random_(low, high)
[0, 1)均匀分布np.random.rand(3, 4)torch.rand(3, 4)
任意均匀分布np.random.uniform(low, high, size)torch.empty(shape).uniform_(low, high)
标准正态分布np.random.randn(3, 4)torch.randn(3, 4)
指定期望和方差的标准正态分布np.random.normal(loc, scale, size)torch.normal(mean, std, size)

numpy和torch均可使用zeros_like, ones_like, full_like, empty_like(tensor/array)创建矩阵。

数学运算

numpytorch
对应位置相乘x1 * x2np.multiply(x1, x2) x1 * x2torch.mul(x1, x2)
向量乘法x1.dot(x2)np.dot(x1, x2) 2d时同矩阵乘法x1.dot(x2)torch.dot(x1, x2)最多1d
矩阵乘向量``torch.mv(x, w0)
矩阵乘法x1 @ x2np.matmul(x1, x2)x1 @ x2torch.mm(x1, x2) 最多2d,bmm最多3d
近似值np.floor/ceil/round(x)x.floor/ceil/round()
取整数部分np.trunc(x)x.trunc(), x.frac()取小数部分
数值截断np.clip(a, a_min, a_max, out=None)torch.clamp(input, min, max, out=None)
求幂np.power(x1, x2) x2数字矩阵均可torch.pow(input: Tensor, exponent: Number)
求逆np.linalg.inv(x)torch.inverse(x)
求伪逆torch.linalg.pinvnp.linalg.inv(a)
求范数np.linalg.norm(x)x.norm(p, dim)torch.norm(x)

维度变换

numpytorch
查看维度x.shape x.size为元素数量x.shape=x.size()
展平为一维,返回视图x.ravel()torch.ravel(x)
展平为一维,返回拷贝x.flatten()x.flatten()=x.flatten(start_dim=0, end_dim=-1)=torch.flatten(x, start_dim=0, end_dim=-1)
*交换维度np.swapaxes(x, axis1, axis2)torch.transpose(x, dim0, dim1)
*维度重排np.transpose(x, new_axis) 默认为转置torch.permute(x, new_dim)
对应维度按数组重复size/shape倍np.tile(x, size)x.repeat(shape)

以上标*的也可以使用ndarray/tensor.resize()等。

其他操作

numpytorch
修改数据类型x.astype(np.int32)x.type(torch.int32)
返回为真的索引np.argwhere(x==k)torch.nonzero(x==k)
复制矩阵x2 = x1.copy()x2 = x1.clone()
指定维度滚动shift步,补齐到前边np.roll(x, shift, axis=None)torch.roll(x, shift, dims=None)
在指定维度反转数据np.flip(x, axis)torch.flip(x, dims)
  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值