torch里面的Tensor、as_tensor、tensor以及from_numpy究竟有何区别?-程序员宅基地

技术标签: pytorch修炼之路  

导读

在使用pytorch的时候我们经常会用到将numpy array转为tensor,以及将tensor转为numpy array的情况。pytroch内置了几种不同的方法可以方便我们将numpy array转换称为tensor,那么这些方法之间究竟有何异同呢?下面我们就来介绍一下

实践

import torch
import numpy as np

#创建一个numpy array的数组
array = np.array([1,2,3,4])

#将numpy array转换为torch tensor
tensor = torch.tensor(array)
Tensor = torch.Tensor(array)
as_tensor = torch.as_tensor(array)
from_array = torch.from_numpy(array)

print(array.dtype)      #int64
#查看torch默认的数据类型
print(torch.get_default_dtype())    #torch.float32

#对比几种不同方法之间的异同
print(tensor.dtype)     #torch.int64
print(Tensor.dtype)     #torch.float32
print(as_tensor.dtype)  #torch.int64
print(from_array.dtype) #torch.int64

我们通过初步的实践分析发现,只有Tensor方法创建的tensor使用了torch的默认数据类型,而其他三种方法都使用了numpy array中的int64数据类型

接下来我们进一步分析,如果我们改变数组的值,会发生什么事情

#创建一个numpy array的数组
array = np.array([1,2,3,4])

#将numpy array转换为torch tensor
tensor = torch.tensor(array)
Tensor = torch.Tensor(array)
as_tensor = torch.as_tensor(array)
from_array = torch.from_numpy(array)

#修改数组的值
array[0] = 10

#打印结果
print(tensor)       #tensor([1, 2, 3, 4])
print(Tensor)       #tensor([1., 2., 3., 4.])
print(as_tensor)    #tensor([10,  2,  3,  4])
print(from_array)   #tensor([10,  2,  3,  4])

通过上面的例子发现,as_tensor方法from_array方法转换的tensor的值都发生了改变,说明其实它们使用的数据和numpy array使用的数据是一样的,也就是说它们和numpy array其实是共享内存的。而Tensor方法tensor方法在转换的时候,则是开辟了新的内存空间来存储tensor的。

总结:所以as_tensorfrom_array是浅拷贝,而tensorTensor则是属于深拷贝,如果我们不会去改变数组里面的数据时,建议采用浅拷贝,这样效率会更高点,因为它们是共享内存的。但是,如果我们有对转换后的tensor做类似fill_scatter_这样的操作时,就需要注意是否能够使用as_tensorfrom_array了。

关于torch中的fill_和scatter_

torh里面包含了很多类似于fill_scatter_方法,带_的方法都是直接修改tensor的内容的。如果我们再转换numpy array时采用的是from_arrayas_tensor就会导致numpy array里面的值也被修改

#创建一个numpy array的数组
array = np.array([1,2,3,4])

#将numpy array转换为torch tensor
tensor = torch.tensor(array)
Tensor = torch.Tensor(array)
as_tensor = torch.as_tensor(array)
from_array = torch.from_numpy(array)

# 修改tensor的内容
fill_tensor = tensor.fill_(0)
print(fill_tensor)          #tensor([0, 0, 0, 0])
print(array)                #[1 2 3 4]
fill_Tensor = Tensor.fill_(1)
print(fill_Tensor)          #tensor([1., 1., 1., 1.])
print(array)                #[1 2 3 4]
fill_as_tensor = as_tensor.fill_(2)
print(fill_as_tensor)       #tensor([2, 2, 2, 2])
print(array)                #[2 2 2 2]
fill_from_array = from_array.fill_(3)
print(fill_from_array)      #tensor([3, 3, 3, 3])
print(array)                #[3 3 3 3]

因为from_arrayas_tensor和numpy array是共享内存的,所以当修改tensor里面的值时numpy array也会被修改

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_29957455/article/details/118496260

智能推荐

【最详细|附源码】Visual C++(VC)6.0最新安装教程_visual c++安装教程-程序员宅基地

文章浏览阅读1.4w次,点赞14次,收藏78次。软件:Visual C++版本:6.0语言:简体中文大小:34.26M安装环境:Win11/Win10/Win8/Win7硬件要求:[email protected] 内存@4G(或更高)下载通道①百度网盘丨下载链接:提取码:dg2n[更多软件]:点击进入管家「软件目录」!_visual c++安装教程

新路由3 高恪魔改固件+底包_新路由3高恪5.0nat1-程序员宅基地

文章浏览阅读2.7w次,点赞2次,收藏8次。新路由3 newifi3 d2 高恪魔改固件,请在breed中先刷入底包,然后启动路由器进入底包系统后,再在底包系统里面网页web升级固件,选择魔改进行升级,切记必须这样操作。压缩包包含了底包和固件解压密码 123下载地址:https://u13909188.pipipan.com/fs/13909188-384246318..._新路由3高恪5.0nat1

戳破“砖家”假面:唯快不破的时代,为什么这件事一定要慢慢做?-程序员宅基地

文章浏览阅读298次。导读:我们生活在一个嘈杂、混乱的世界中。生活中,我们有很多“权威”和“专家”,他们标榜自己是内行人,宣称自己掌握着该领域的真理,而我们需要做的只有两个字——接受。但事实上..._唯快不破的人为什么定

初始化时checkbox选中问题-程序员宅基地

文章浏览阅读746次。首先我们大家在写页面的时候可能回经常遇到checkbox、radio等一些使选中或者是不选中的问题。这是我在项目当中做的时候发现的一个小知识点,把它赶紧记录下来。以便以后复习与巩固。 现把代码写出来再解释: function operateCheckOrRadio() { var sForm = document.getElementById("sform"); var sStatus = d..._flutter checkbox用变量初始化无法设置为选中状态

UE5——问题——MediaPlayer的使用播放视频注意点_ue mediaplayer-程序员宅基地

文章浏览阅读1.1k次。UE5——问题——MediaPlayer的使用播放视频注意点_ue mediaplayer

毕设仿真分享 单片机非接触式红外感应体温计-程序员宅基地

文章浏览阅读311次,点赞9次,收藏7次。非接触式电子体温计主要利用红外测温原理,一切温度高于绝对零度(-273.35℃)的物体,由于分子热运动,物体会不停地向外辐射能量。物体辐射能量的大小与它的表面温度有十分密切的关系。因此,通过测量物体辐射的能量,就能够测量出物体的温度。本用户手册中的非接触式电子体温计就是利用这种测量方法,实现测量人体体温的功能。

随便推点

欧拉图和哈密顿图_哈密顿通路度为偶数-程序员宅基地

文章浏览阅读3.8k次。欧拉图及欧拉路径欧拉图 如果图G上有一条经过所有顶点、所有边的闭路径(边不重复,顶点可以重复)充分必要条件 无向图:G连通,所有顶点的度都是偶数有向图:G弱连通,每个顶点出度与入度相等欧拉路径 如果图G上有一条经过所有顶点、所有边的路径(边不重复,顶点可以重复)充分必要条件 无向图:G连通,恰有两个顶点的度是奇数有向图:G连通,恰有两个顶点的出度与入度不相等,其中一个出度比入度多_哈密顿通路度为偶数

Linux下SVN安装配置和使用中遇到的问题-程序员宅基地

文章浏览阅读68次。两个命令:svn info :显示版本库信息,svn的下载url等。svn co https://xxxxx/xxx wodemulu (通过我的目录制定co的文件夹)svn st:显示修改的文件。=-=========================================第一章 安装1. 采用源文件编译安装。源文件共两个(可下载完传入linux),为:s..._can't lunch modelsim make sure

【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)_kosaraju算法代码-程序员宅基地

文章浏览阅读332次。代码:typedef struct anode { int adjvex;//该边的邻接点编号 struct anode* nexarc;//指向下一条边的指针 int weight;//该边的相关信息,比如权值}arcnode;//边结点类型typedef struct vnode { //InfoTyoe info; 顶点的其他信息 arcnode* firstarc;//指向第一个边结点}Vnode;//邻接表头结点类型typedef struct {_kosaraju算法代码

程序员的自我评价_程序员自我评价-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏2次。篇一:程序员简历自我评价程序员简历自我评价本人勤奋踏实,工作认真负责,自学能力强;性格开朗,容易与人相处,注重团队协作精神,且能承受较大压力。注重专业基础学习和实践能力的培养,在校期间不仅做过多个课程设计暑假期间也去过单位实践过,对java编程和网站开发具有浓厚的兴趣。篇二:优秀的程序员自我鉴定优秀的程序员自我鉴定以下一篇是一名优秀并且有工作经验的程序员的自我鉴定范文:大家好,我叫xxx。我性格开朗,乐于与人交往,诚实,正直,有教强的上进心,较强的学习能力,在学校团学会的工作使我组织_程序员自我评价

vue的vue-resource和axios介绍_vue-resuorce-程序员宅基地

文章浏览阅读1.2k次,点赞26次,收藏14次。vue的vue-resource和axios介绍_vue-resuorce

MySQL笔记复习(实例 全)_在 goods_name 列上加普通索引-程序员宅基地

文章浏览阅读907次。mysql复习一:复习前的准备1:确认你已安装wamp2:确认你已安装ecshop,并且ecshop的数据库名为shop二 基础知识:1.数据库的连接mysql -u -p -h-u 用户名-p 密码-h host主机2:库级知识2.1 显示数据库: show databases;2.2 选择数据库: use dbname;2.3 创建数据库_在 goods_name 列上加普通索引