TensorNumPy 有很高的相似性,彼此之间的互操作也非常简单有效,需要注意的是 TensorNumPy 共享内存,由于 NumPy 历史悠久,所以遇到 Tensor 不支持的操作时,可以先转换成 NumPy ,处理后再转换成 Tensor,转换开销很小。

1. Tensor 转化为 NumPy

In [1]: import torch as tIn [2]: a = t.ones(5)In [3]: a
Out[3]: tensor([1., 1., 1., 1., 1.])In [4]: b = a.numpy()In [5]: b
Out[5]: array([1., 1., 1., 1., 1.], dtype=float32)

2. NumPy 转化为 Tensor

In [6]: import numpy as npIn [7]: a = np.ones(5)In [8]: a
Out[8]: array([1., 1., 1., 1., 1.])In [9]: b =t.from_numpy(a)In [10]: b
Out[10]: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)

值得注意的是,Torch 中的 TensorNumPy 中的 Array 共享内存位置,一个改变,另一个也同样改变。注意使用的是 b.add_()

In [10]: b
Out[10]: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)In [11]: b.add_(1)
Out[11]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)In [12]: a
Out[12]: array([2., 2., 2., 2., 2.])In [13]: b
Out[13]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

下面看使用 b.add() 发现 b 并没有改变。

In [13]: b
Out[13]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)In [14]: b.add(2)
Out[14]: tensor([4., 4., 4., 4., 4.], dtype=torch.float64)In [15]: a
Out[15]: array([2., 2., 2., 2., 2.])In [16]: b
Out[16]: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

b.add_()b.add() 的区别

任何操作符都固定地在前面加上 _ 来表示替换。例如:y.copy_(x)y.t_(),都将改变 y

3. PyTorch 广播法则

当输入数组的某个维度的长度为 1 时,计算时沿此维度复制扩充成一样的形状。

可以通过以下两个函数组合手动实现广播法则:

  • unsqueeze 或者 view : 为数据的某一维的形状补 1,实现法则 1
  • expand 或者 expand_as ,重复数组,实现法则 3;该操作不会复制数组,所以不会占用额外空间

注意: repeat 实现和 expand 相类似的功能,但是 repeat 会把形同的数据复制多份,因此会占用额外的空间。

3.1 自动广播法则

In [17]: a = t.ones(3,2)In [18]: a
Out[18]:
tensor([[1., 1.],[1., 1.],[1., 1.]])In [19]: b = t.zeros(2,3,1)In [20]: b
Out[20]:
tensor([[[0.],[0.],[0.]],[[0.],[0.],[0.]]])

可以看到 a 是二维的,而 b 是三维的,但是可以通过广播法则直接进行相加计算。

In [23]: a + b
Out[23]:
tensor([[[1., 1.],[1., 1.],[1., 1.]],[[1., 1.],[1., 1.],[1., 1.]]])In [24]:

3.2 手动广播法则

In [24]: a.unsqueeze(0).expand(2,3,2) + b.expand(2,3,2)
Out[24]:
tensor([[[1., 1.],[1., 1.],[1., 1.]],[[1., 1.],[1., 1.],[1., 1.]]])In [25]:

4. Numpy 广播法则

  • 让所有输入数组都向其中 shape 最长的数组看齐,shape 中不足的部分可通过在前面加 1 补齐;
  • 两个数组要么在某一维度的长度一致,要么其中一个为 1,否则不能计算;

PyTorch 笔记(10)— Tensor 与 NumPy 相互转换、两种共享内存以及两者的广播法则相关推荐

  1. Tensor 和 NumPy 相互转换

    Tensor 和 NumPy 相互转换 我们很容易用numpy()和from_numpy()将Tensor和NumPy中的数组相互转换.但是需要注意的一点是: 这两个函数所产生的Tensor和NumP ...

  2. python把矩阵存为文件_python 读取文件并把矩阵转成numpy的两种方法

    在当前目录下: 方法1: file = open('filename') a =file.read() b =a.split('\n')#使用换行 len(b) #统计有多少行 for i in ra ...

  3. python numpy读取数据_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  4. python大神读取_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  5. 在Windows 10上观看DVD的两种简便方法

    在Windows 10上观看DVD的两种简便方法 - Win 10学院 - win10系统之家 (ghost580.com) 工具1: 5KPlayer 工具2: WinX DVD Ripper Pl ...

  6. pyqt5笔记 — 重写窗口方法closeEvent()的两种方式

    @[TOC](pyqt5笔记 - 重写窗口方法closeEvent()的两种方式) 一.重写的作用 在开发过程中,经常会遇到一种需求:服务器端在主动发出一些信息给客户端,而在用户端关闭UI的时候,需要 ...

  7. (笔记)堆和栈的区别-两种不同的数据结构

    堆栈其实是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除. 要点:堆:顺序随意. 栈:后进先出(Last-In/First-Out) 堆和栈 ...

  8. pytorch 语义分割loss_关于pytorch语义分割二分类问题的两种做法

    形式1:输出为单通道 分析 即网络的输出 output 为 [batch_size, 1, height, width] 形状.其中 batch_szie 为批量大小,1 表示输出一个通道,heigh ...

  9. Android开发笔记(一百二十)两种侧滑布局

    SlidingPaneLayout SlidingPaneLayout是Android在android-support-v4.jar中推出的一个可滑动面板的布局,在前面< Android开发笔记 ...

最新文章

  1. float js 正则 验证_使用HTML和Vuejs进行表单验证
  2. python glob 模块 map函数
  3. 第一个问题就难倒我了!
  4. 1.18.2.10 解释表:Table.explain、物理执行计划等
  5. supervisor nginx_Supervisor 的使用和进阶 (3)
  6. Java中反射机制(Reflection)学习
  7. 容器中Java RAM的使用:不会丢失内存的5大技巧
  8. UCI机器学习数据集
  9. go语言os.exit(1)_Go语言os包用法简述
  10. 第四:Python发送邮件时实现生成测试报告/邮件自动发送
  11. 多媒体计算机主机有哪些硬件,现在市场上多媒体电脑主要有哪些硬件部分组成?...
  12. 有关计算机学的心得体会,关于计算机学习心得体会大全
  13. java两个日期相减_java将两个日期相减得到天数
  14. 网约车定价策略:手机越贵打车越贵?
  15. PCIE实现PIO模式寄存器读写调试记录
  16. pytorch:线性回归实战
  17. 2019年秋季校招前端面经
  18. 【Celery】Celery的简易部署和应用
  19. css3切角文本框_CSS3如何实现4个切角
  20. 图像识别教程(百度AI开放平台)

热门文章

  1. 2022-2028年中国安防行业研究及前瞻分析报告
  2. 2022-2028年中国电商物流行业投资分析及前景预测报告
  3. Python gRPC 安装
  4. Centos7常用命令
  5. 使用python建立简单的树机构
  6. 语义网所谓的“本体”的具体例子是什么?人工智能
  7. Java中如何实现Date与String之间的数据类型转换
  8. 汽车HUD(Head-up Display)的技术难点
  9. 自动驾驶的分级和行业现状
  10. Androidx FloatingActionButton 中间图片颜色值修改