Technical Summary —— Pytorch & Numpy
近期致力于总结科研或者工作中用到的主要技术栈,从技术原理到常用语法,这次查缺补漏当作我的小百科。主要技术包括:
- ✅数据库常用:MySQL, Hive SQL, Spark SQL
- ✅大数据处理常用:Pyspark, Pandas
- ⚪ 图像处理常用:OpenCV, Matplotlib
- ⚪ 机器学习常用:SciPy, Sklearn
- ✅ 深度学习常用:Pytorch, Numpy
- ✅ 常用命令: Shell, Git, Vim
以下整理错误或者缺少的部分欢迎指正!!!
简介
Torch的tensor可以在GPU上加速运算,Numpy的ndarray只能在CPU上加速运算。
导包与相互转化
1 | import numpy as np |
相同语法
功能 | 函数 |
---|---|
查看矩阵行数 | 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 * x2 或np.multiply(x1, x2) |
x1 * x2 或torch.mul(x1, x2) |
向量乘法 | x1.dot(x2) 或np.dot(x1, x2) 2d时同矩阵乘法 |
x1.dot(x2) 或torch.dot(x1, x2) 最多1d |
矩阵乘向量 | `` | torch.mv(x, w0) |
矩阵乘法 | x1 @ x2 或np.matmul(x1, x2) |
x1 @ x2 或torch.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) |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment