一,创建张量

1. 生成float格式的张量:

a = torch.tensor([1,2,3],dtype = torch.float)

2. 生成从1到10,间隔是2的张量:

b = torch.arange(1,10,step = 2)

3. 随机生成从0.0到6.28的10个张量

注意:
(1).生成的10个张量中包含0.0和6.28(两端点)
(2).生成的张量步长是随机的

c = torch.linspace(0.0,2*3.14,10)

4. zeros_like是生成与a格式相同,但是是全0且格式是float的张量

a = torch.ones((3,3),dtype = torch.int)
b = torch.zeros_like(a,dtype = torch.float)

5. 将b中为0或NULL元素替换成5

torch.fill_(b,5)

6. 均匀随机分布:torch.manual_seed(0)为CPU中设置种子,生成随机数

torch.manual_seed(0)
minval,maxval = 0,10
a = minval + (maxval-minval)*torch.rand([5])

7. 正态分布随机

均值means是一个张量,包含每个输出元素相关的正态分布的均值。
std是一个张量,包含每个输出元素相关的正态分布的标准差。
均值和标准差的形状不须匹配,但每个张量的元素个数须相同。

b = torch.normal(mean = torch.zeros(3,3), std = torch.ones(3,3))

8. 正态分布随机

mean,std = 2,5
c = std*torch.randn((3,3))+mean

9. 整数随机排列

d = torch.randperm(20)

10. 生成特殊矩阵

I = torch.eye(3,3) #单位矩阵
t = torch.diag(torch.tensor([1,2,3])) #对角矩阵

二,索引切片

张量的索引切片方式和numpy几乎是一样的。切片时支持缺省参数和省略号。

1.切片第1行至第3行

print(t[1:4,:])

2.切片第1行至最后一行,第0列到最后一列每隔两列取一列

print(t[1:4,:4:2])

3.可以使用索引和切片修改部分元素

x = torch.tensor([[1,2],[3,4]],dtype = torch.float32,requires_grad=True)
x.data[1,:] = torch.tensor([0.0,0.0])

4.对于不规则的切片提取

可以使用torch.index_select, torch.take, torch.gather, torch.masked_select.

  1. 抽取每个班级第0个学生,第5个学生,第9个学生的全部成绩
torch.index_select(scores,dim = 1,index = torch.tensor([0,5,9]))
  1. 抽取每个班级第0个学生,第5个学生,第9个学生的第1门课程,第3门课程,第6门课程成绩
q = torch.index_select(torch.index_select(scores,dim = 1,index = torch.tensor([0,5,9])),dim=2,index = torch.tensor([1,3,6]))
  1. 抽取第0个班级第0个学生的第0门课程,第2个班级的第4个学生的第1门课程,第3个班级的第9个学生第6门课程成绩
    take将输入看成一维数组,输出和index同形状
s = torch.take(scores,torch.tensor([0*10*7+0,2*10*7+4*7+1,3*10*7+9*7+6]))   #感觉跟数组序列号一样
  1. 抽取分数大于等于80分的分数(布尔索引),结果是1维张量
g = torch.masked_select(scores,scores>=80)

5.通过修改张量的部分元素值得到新的张量

torch.where可以理解为if的张量版本。
torch.index_fill的选取元素逻辑和torch.index_select相同。
torch.masked_fill的选取元素逻辑和torch.masked_select相同。

  1. 如果分数大于60分,赋值成1,否则赋值成0
ifpass = torch.where(scores>60,torch.tensor(1),torch.tensor(0))
  1. 将每个班级第0个学生,第5个学生,第9个学生的全部成绩赋值成满分
torch.index_fill(scores,dim = 1,index = torch.tensor([0,5,9]),value = 100)
#等价于 scores.index_fill(dim = 1,index = torch.tensor([0,5,9]),value = 100)
  1. 将分数小于60分的分数赋值成60分
b = torch.masked_fill(scores,scores<60,60)
#等价于b = scores.masked_fill(scores<60,60)

三,维度变换相关函数

维度变换相关函数主要有 torch.reshape(或者调用张量的view方法),torch.squeeze,torch.unsqueeze, torch.transpose
torch.reshape 可以改变张量的形状。
torch.squeeze 可以减少维度。
torch.unsqueeze 可以增加维度。
torch.transpose 可以交换维度。

1. 改成 (3,6)形状的张量

b = a.view([3,6]) #torch.reshape(a,[3,6])

2. 改回成 [1,3,3,2] 形状的张量

c = torch.reshape(b,[1,3,3,2]) # b.view([1,3,3,2])

3. torch.squeeze消除维度。

如果张量在某个维度上只有一个元素,利用torch.squeeze可以消除这个维度。

s = torch.squeeze(a)

4. torch.unsqueeze

torch.unsqueeze的作用和torch.squeeze的作用相反,增加维度。

#在第0维插入长度为1的一个维度
d = torch.unsqueeze(s,axis=0)

5.转换成 Pytorch默认的图片格式

torch.transpose可以交换张量的维度,torch.transpose常用于图片存储格式的变换上。
如果是二维的矩阵,通常会调用矩阵的转置方法 matrix.t(),等价于 torch.transpose(matrix,0,1)。

# 转换成 Pytorch默认的图片格式 Batch,Channel,Height,Width
# 需要交换两次
data_t = torch.transpose(torch.transpose(data,1,2),1,3)print(matrix.t()) #等价于torch.transpose(matrix,0,1)

四,合并分割

可以用torch.cat方法和torch.stack方法将多个张量合并,可以用torch.split方法把一个张量分割成多个张量。

1.torch.cat和torch.stack

torch.cat和torch.stack有略微的区别,torch.cat是连接,不会增加维度,而torch.stack是堆叠,会增加维度。

abc_cat = torch.cat([a,b,c],dim = 0)
abc_stack = torch.stack([a,b,c],axis = 0)
#torch中dim和axis参数名可以混用,=0时是按照行连接,=1列连接
torch.cat([a,b,c],axis = 1)

2.torch.split

torch.split是torch.cat的逆运算,可以指定分割份数平均分割,也可以通过指定每份的记录数量进行分割。

a,b,c = torch.split(abc_cat,split_size_or_sections = 2,dim = 0) #每份2个进行分割
p,q,r = torch.split(abc_cat,split_size_or_sections =[4,1,1],dim = 0) #每份分别为[4,1,1]

五,张量数学计算

1.取整

print(torch.round(x)) #保留整数部分,四舍五入
print(torch.floor(x)) #保留整数部分,向下归整
print(torch.ceil(x))  #保留整数部分,向上归整
print(torch.trunc(x)) #保留整数部分,向0归整

2.除法余数

print(torch.fmod(x,2)) #作除法取余数
print(torch.remainder(x,2)) #作除法取剩余的部分,结果恒正

3.幅值裁剪

x = torch.tensor([0.9,-0.8,100.0,-20.0,0.7])
y = torch.clamp(x,min=-1,max = 1)
z = torch.clamp(x,max = 1)

4.累乘,标准差,方差,中位数

print(torch.prod(a)) #累乘
print(torch.std(a))  #标准差
print(torch.var(a))  #方差
print(torch.median(a)) #中位数

5.张量排序

torch.sort和torch.topk可以对张量排序

print(torch.topk(a,2,dim = 1),"\n") #沿给定dim维度返回输入张量input中 k 个最大值。
print(torch.sort(a,dim = 1),"\n")

六,矩阵运算

1.矩阵乘法

print(a@b)  #等价于torch.matmul(a,b) 或 torch.mm(a,b)

2.矩阵转置

print(a.t())

3.矩阵逆,必须为浮点类型

print(torch.inverse(a))

4.矩阵求trace

print(torch.trace(a))

5.矩阵求范数

print(torch.norm(a))

6.矩阵行列式

print(torch.det(a))

7.矩阵特征值和特征向量

print(torch.eig(a,eigenvectors=True))

8.矩阵QR分解

矩阵QR分解, 将一个方阵分解为一个正交矩阵q和上三角矩阵r
QR分解实际上是对矩阵a实施Schmidt正交化得到q

q,r = torch.qr(a)
print(q@r)#还原a

9.矩阵svd分解

svd分解可以将任意一个矩阵分解为一个正交矩阵u,一个对角阵s和一个正交矩阵v.t()的乘积
svd常用于矩阵压缩和降维

u,s,v = torch.svd(a)
print(u@torch.diag(s)@v.t())    #还原a

七,广播机制

torch.broadcast_tensors

torch.broadcast_tensors可以将多个张量根据广播规则转换成相同的维度。

a_broad,b_broad = torch.broadcast_tensors(a,b)  #转换成相同的维度

Pytorch有关张量的各种操作相关推荐

  1. PyTorch 的 Autograd、计算图、叶子张量、inplace 操作、动态图,静态图(来自知乎)

    本博文来自:https://zhuanlan.zhihu.com/p/69294347 非常感谢此博主! PyTorch 作为一个深度学习平台,在深度学习任务中比 NumPy 这个科学计算库强在哪里呢 ...

  2. 【Pytorch神经网络理论篇】 03 Pytorch快速上手(三)张量的数据操作

    1 张量的数据操作 1.1 torch.reshape()实现数据维度变化 import torch a = torch.tensor([[1,2],[3,4]]) print(torch.resha ...

  3. PyTorch | (2)PyTorch 入门-张量

    PyTorch | (1)初识PyTorch PyTorch | (2)PyTorch 入门-张量 PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可 ...

  4. 神经网络与深度学习(二) pytorch入门——张量

    本文章通过参考飞桨AI Studio - 人工智能学习与实训社区  教程进行pytorch相关学习. 目录 一. 概念:张量.算子 二. 使用pytorch实现张量运算 1.2.1 创建张量 1.2. ...

  5. JavaScript玩转机器学习:张量(Tensors) 和 操作(operations)

    JavaScript玩转机器学习:张量(Tensors) 和 操作(operations) 张量(Tensors) 和 操作(operations) TensorFlow.js是一个在JavaScri ...

  6. pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换

    pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换 1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为 ...

  7. pytorch中张量的阶数理解

    pytorch中张量的阶数理解 推荐打开2个页面,对比原四阶张量理解各阶的对应关系. 创建一个四阶张量: import torch x = torch.linspace(0,71,72).view(2 ...

  8. Pytorch学习——张量

    目录 一.张量基本概念 二.Tensor 2.1 Variable 2.2.Tensor 三.张量的创建 3.1 直接创建 3.2 依据数值创建 3.3 依据概率分布创建张量 四.张量操作 4.1 张 ...

  9. pytorch 创建张量tensor

    pytorch 创建张量tensor 先看下面一张图 通过上图有了一个直观了解后,我们开始尝试创建一下. 先创建一个标量和一个向量 a = torch.tensor([1]) #标量 print(a) ...

最新文章

  1. 阅读笔记 CCL: Cross-modal Correlation Learning with Multi-grained Fusion by Hierarchical Network
  2. 帝国cms 多个php,帝国cms多值字段数据显示方法
  3. Drupal8系列(五):主题制作之搭建框架-Ubuntu 14.04 LTS
  4. SQL 查询语句总是先执行 SELECT?
  5. Python(13)-函数,lambda语句
  6. 一场关于动态化开发实践的技术探讨
  7. java第一 ++--
  8. c语言统计数字字母个数,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  9. 50条大牛C++编程开发学习建议
  10. Nginx学习总结(12)——Nginx各项配置总结
  11. 漫画:趣解鸿蒙 OS 如何实现跨平台?
  12. 邮件服务器突然很慢,原因探究与处理
  13. wso2 mysql_WSO2 DAS使用mysql集群APIM
  14. ID3算法(含实例)
  15. 服务器断电后可以自动开机吗,想要服务器断电后自动开机,怎么设置?
  16. Java名词解释什么是继承_java程序设计名词解释
  17. ps奥顿柔焦效果+提取线稿
  18. 链表--逆时针旋转一个链表
  19. 计算机应用评估与反馈,《计算机应用基础》(计算机应用基础教学效果评价研究)...
  20. ros2上怎样才能玩rmf?

热门文章

  1. React面试题总结,含爱奇艺,小米,腾讯,阿里
  2. LeetCode Range Sum Query Immutable
  3. /src/applicationContext.xml
  4. BaseYii_autoload
  5. python实现软件的注册功能(机器码+注册码机制)
  6. ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)
  7. Android用Intent和Bundle传list
  8. 易语言动画框和动画物体通过代码载入外部图片数据不显示!
  9. MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索
  10. 高仿人人Android梦想版终极源码发送(转)