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

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

简介

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

导包与相互转化

1
2
3
4
5
6
7
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()

相同语法

功能 函数
查看矩阵行数 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()等。

专属语法

功能 函数
原地打乱顺序 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数量的张量块
获取mask x.ge(0.5) ge>,le<,gt>=,lt<=,eq=
根据mask筛选 torch.masked_select(x, x.le(20))

不同语法对比

矩阵创建

numpy torch
基础变量 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)创建矩阵。

数学运算

numpy torch
对应位置相乘 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.pinv np.linalg.inv(a)
求范数 np.linalg.norm(x) x.norm(p, dim)torch.norm(x)

维度变换

numpy torch
查看维度 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()等。

其他操作

numpy torch
修改数据类型 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)