* torch.Tensor 存储和变换数据的工具

* Tensor与Ndarray多维数组类似,可提供GPU计算和自动求梯度

* 标量:0纬张量,一个数字

* 向量:1纬张量,[ ]

* 矩阵:2纬张量,[ [ ] ]

首先导入torch,查看版本号

importtorch#打印torch版本

print(torch.__version__)#查看是否支持GPUtorch.cuda.is_avaliable()

代码运行后的结果是:1.4.0

True

1.创建Tensor

1.11 直接创建

* torch.tensor(value)

* value:可以是任何维度的张量

print("创建一个标量5")

x= torch.tensor(5)print("创建一个向量[]")

y= torch.tensor([2,3])print("创建一个矩阵[ [ ] ]")

z= torch.tensor([[1,2],

[2,3]])print(x)print(y)print(z)

输出结果是:

创建一个标量5

创建一个向量[]

创建一个矩阵[ [ ] ]

tensor(5)

tensor([2, 3])

tensor([[1, 2],

[2, 3]])

1.2使用方法创建

* torch.empty(shape,dtype = type):创建未初始化的Tensor,可指定数据类型,dtype参数可省略

* torch.rand(shape) :创建随机矩阵

* torch.zeros(shape):创建0矩阵

* 创建维度均为2纬矩阵

print("创建二维未初始化矩阵")

A= torch.empty((2,2))print(A)print("创建随机矩阵")

B= torch.rand((2,2))print(B)print("创建0矩阵")

C= torch.zeros((2,2))print(C)

输出结果是:

创建二维未初始化矩阵

tensor([[0.0000e+00, 1.4279e+00],

[-9.3980e-11, 4.5908e-41]])

创建随机矩阵

tensor([[0.3857, 0.0058],

[0.1388, 0.9339]])

创建0矩阵

tensor([[0., 0.],

[0., 0.]])

1.3通过现有的Tensor创建

* matrix.new_ones(shape,dtype) 可以改变维度

* torch.randn_like(matirx,dtype)

print("将原本2*2未初始化矩阵进行重新创建")

B= B.new_ones(5,3)print(B)print("将原本2*2未初始化矩阵进行重新创建")

A= torch.randn_like(A, dtype =torch.float)print(A)

输出结果是:

将原本2*2未初始化矩阵进行重新创建

tensor([[1., 1., 1.],

[1., 1., 1.],

[1., 1., 1.],

[1., 1., 1.],

[1., 1., 1.]])

将原本2*2未初始化矩阵进行重新创建

tensor([[0.1454, -0.1173],

[-0.7503, 0.5255]])

1.4Tensor的基本方法

* matrix.shape: 获取Tensor形状

* matirx.size():获取Tensor形状 返回一个tuple,支持tuple的所有操作

print("获取B矩阵形状")print(B.shape)print(B.size())

输出结果是:

获取B矩阵形状

torch.Size([5, 3])

torch.Size([5, 3])

2 Tensor操作

2.1 算法操作

2.11 加法操作

* matrix1 + matirx2

* torch.add(matrix1, matrix2, out = A) out指定输出参数,可省略

* inplace matrix1.add_(matrix2) == (matirx1 += matrix2)

print("使用 + 完成加法操作")print(A +C)print("使用torch.add完成加法操作")print(torch.add(A,C))print("使用inplace完成加法操作")print(C.add_(A))

输出结果是:

使用+完成加法操作

tensor([[0.1454, -0.1173],

[-0.7503, 0.5255]])

使用torch.add完成加法操作

tensor([[0.1454, -0.1173],

[-0.7503, 0.5255]])

使用inplace完成加法操作

tensor([[0.1454, -0.1173],

[-0.7503, 0.5255]])

2.1.2 索引

* 类似于Numpy

* 索引结果与原数据共享内存

A = torch.rand(5,5)print('查看创建Tensor')print(A[1][1])

A[1][1] = 5

print("查看A矩阵第一行第一列是否为5")print(A[1][1])

输出结果是:

查看创建Tensor

tensor(0.6124)

查看A矩阵第一行第一列是否为5

tensor(5.)

2.1.3 改变形状

* marix.clone() 克隆新副本,解决共享内存带来的问题

* matrix.view(shape) view() 前后共享data

* matrix.reshape(shape)

#查看clone与变量赋值的区别

print("查看A变量地址")print(id(A))

A_cl=A.clone()print('查看克隆新副本地址')print(id(A_cl))

A_an=Aprint('查看变量重新赋值后的地址')print(id(A_an))

输出结果是:

查看A变量地址2337547400576查看克隆新副本地址2337538344512查看变量重新赋值后的地址2337547400576

note:这里主要是解释共享data的问题。直接view()的话维度改变,操作的是同一内存的数据。不会生成新的维度的数据。

* 变量赋值相当于引用,地址不变,只想同一块内存

* clone()操作会重新申请内存空间

* matrix.item() 将标量Tensor转化为number

* https://pytorch.org/docs/stable/tensors.html     Tensor操作链接

2.1.4 Tensor的广播机制

* 自动使得运算的Tensor相同的操作

* 首先会比较最靠右的维度,如果最靠右的维度相等或其中一个为 1,则认为此维度相等;

* 再继续向左比较,如果一直满足,则认为两者兼容;

* 最后,分别在对应维度上发生广播,以此补齐直到维度一致;

x = torch.rand(4 , 6)

y= torch.rand(4, 1)print(torch.add(x , y))

输出结果是:

tensor([[0.6108, 0.1842, 0.9873, 0.9042, 0.2456, 0.4298],

[1.0251, 0.6726, 1.2724, 1.2861, 1.1256, 0.5654],

[1.0223, 0.3473, 0.5952, 0.3701, 0.4500, 0.4993],

[0.0542, 0.9524, 0.1668, 0.5762, 0.0671, 0.4689]])

2.1.5 Tensor与Numpy的相互转换

* tensor.numpy() 可将Tensor转为ndarray数据

a = torch.rand(3,2)print(id(a))

b=a.numpy()print(id(b))print(a)print(b)

输出结果为:2337547166400

2337547429088tensor([[0.3145, 0.9862],

[0.7604, 0.9342],

[0.3104, 0.7312]])

[[0.31446308 0.9861587]

[0.7603721 0.9341993]

[0.31042498 0.73123205]]

Numpy转为Tensor

* torch.from_numpy(array)

* torch.Tensor()

importnumpy as np

c=torch.from_numpy(b)

d=torch.Tensor(b)print(type(c))print(type(d))

2.1.6 Tensor on GPU

* .to("cuda") 将Tensor在GPU上运算

x.to("cuda")

* .to(device) 将Tensor在GPU运算

torch.device("cuda")

x.to(device)

* .to("cpu") 将Tensor在CPU上运算

验证GPU的运算速度

%%time #jupyter notebook中的魔法语句,可以输出当前代码块的运行速度print("使用device")

device= torch.device("cuda")

x= torch.rand(200,100).to(device)

y= torch.rand(200,100).to(device)print(x + y)

输出结果是:

使用device

tensor([[1.3311, 1.7433, 1.1089, ..., 0.8775, 1.1430, 0.4877],

[1.1953, 0.3628, 0.6479, ..., 0.4781, 0.9154, 1.3447],

[1.2134, 0.5482, 1.7713, ..., 0.9025, 1.1786, 0.2083],

...,

[0.9276, 0.8605, 0.9905, ..., 0.9992, 1.1613, 0.8636],

[1.2191, 0.6350, 0.9921, ..., 1.7540, 1.0139, 1.2921],

[1.2137, 0.9510, 0.9126, ..., 0.8433, 0.5871, 1.0881]],

device='cuda:0')

Wall time:6.45 s

验证CPU运算速度

%%timeprint("使用CPU")

x= torch.rand(200,100).to("cpu")

y= torch.rand(200,100).to("cpu")print(x + y)

输出结果是:

使用CPU

tensor([[1.4920, 1.1891, 0.0936, ..., 0.5056, 1.6395, 1.0162],

[1.4211, 0.9837, 1.1501, ..., 1.2990, 0.7121, 0.3505],

[1.1503, 1.0263, 1.4055, ..., 0.6856, 0.3320, 0.7620],

...,

[0.4615, 1.0520, 1.3409, ..., 1.1014, 1.0806, 0.9630],

[0.9770, 1.4159, 1.6652, ..., 0.9515, 1.2479, 1.2459],

[0.7622, 0.9159, 0.9734, ..., 0.5249, 0.1216, 0.6906]])

Wall time:112 ms

查看同样维度矩阵计算GPU与CPU的速度差异

print("GPU 比 CPU 的运算速度块: %.2f 倍" %(112 / 6.45))

输出结果是:

GPU 比 CPU 的运算速度块:17.36 倍

device 查看tensor_Tensor数据操作相关推荐

  1. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...

  2. 2019-7-26 [MySQL] 安装与介绍 语句分类/语法 数据类型 DDL数据定义:创建/查看/删除/使用 DML数据操作:增删改 主键约束 自动增长列 非空约束 默认值 Navicat

    文章目录 0.知识回顾 1.数据库介绍 1.1 数据库概述 1.1.1 什么是数据库 1.1.2 什么是数据库管理系统 1.1.3 数据库与数据库管理系统的关系 1.2 数据库表 1.3 表数据 1. ...

  3. linux命令查看内存数据,Linux 查看内存条数据和大小命令

    查看内存条数据和大小命令: sudo dmidecode | grep -A16 "Memory Device$" 需要root 权限.. [life@localhost mp3b ...

  4. Redis数据库搭建主从同步(主从概念、主从配置、主从数据操作)

    1. 主从概念 ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读 ...

  5. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)

    1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名  [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...

  6. MySQL基础篇:数据操作语言DML

    1.概述 数据操作语言(DML)用于插入.修改.删除.查询数据记录,包括以下SQL语句: INSERT:添加数据到数据库中 UPDATE:修改数据库中的数据 DELETE:删除数据库中的数据 2.插入 ...

  7. Python—pandas中DataFrame类型数据操作函数

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构.  本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数.  1)查看DataFram ...

  8. 表操作,数据操作,单表查询,python操作数据库

    1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...

  9. MySQl的库操作、表操作和数据操作

    一.库操作 1.1库的增删改查 (1)系统数据库: performance_schema:用来收集数据库服务器的性能参数,记录处理查询时发生的各种事件.锁等现象 mysql:授权库,主要存储系统用户的 ...

最新文章

  1. 从PPT到Word,用Python轻松实现办公自动化
  2. 3.Vue 条件渲染
  3. java转换为c#_C#vs Java哪一个更快? 将25k C#转换为Java(2)
  4. 是什么让支付宝网络诈骗案占比逐渐下降?
  5. Hadoop学习笔记一:单节点安装
  6. 云计算时代的DCI技术
  7. 31、栈的压入、弹出序列(Python)
  8. nexus下载地址分享
  9. jmeter使用详解
  10. word一键生成ppt 分页_一键实现Word转PPT的三种方法评测
  11. 春节假期最值得阅读的10本书
  12. 起风了数字简谱用计算机,起风了钢琴简谱-数字双手-买辣椒也用券
  13. node拉取微信权限,实现自定义分享微信朋友圈等操作
  14. 分层抽样不按比例如何加权_按比例分层抽样和定额抽样的区别?
  15. android自带下拉阻尼动画,Android实现简单的下拉阻尼效应示例代码
  16. Luogu P5037 抓捕
  17. C++ 资源大全(各种库)---------伯乐在线
  18. 第四章 微服务容错Resilience4j
  19. 【PyTorch深度学习实践】P9 kaggle otto商品分类作业(含注释)
  20. iphone4s照片删掉了如何恢复

热门文章

  1. O2O商城系统,适合本地电商发展的商城系统!
  2. 大道至简----多示例学习与注意力机制的巧妙结合
  3. 纯css实现文字跳动的动画效果
  4. Mini Hook 主要代码理解
  5. 串口调试助手中设置快捷键
  6. Chrome开启多线程下载
  7. inux中,如何把一个目录及其子目录中的读写权限交给一个普通用户!
  8. 在Linux中开机自动运行普通用户脚本程序
  9. 隐藏表白技能,python教你如何使用图片exif信息隐藏表白,教你如何修改,查询exif信息。
  10. 涂鸦智能三明治音视频核心板(BK7256)开箱测评