解决numpy和torch数据类型转化的问题


Posted in Python onMay 23, 2021

在实际计算过程中,float类型使用最多,因此这里重点介绍numpy和torch数据float类型转化遇到的问题,其他类型同理。

numpy数据类型转化

numpy使用astype转化数据类型,float默认转化为64位,可以使用np.float32指定为32位

#numpy转化float类型
a= np.array([1,2,3])
a = a.astype(np.float)
print(a)
print(a.dtype)

[1. 2. 3.]

float64

不要使用a.dtype指定数据类型,会使数据丢失

#numpy转化float类型
b= np.array([1,2,3])
b.dtype= np.float32
print(b)
print(b.dtype)

[1.e-45 3.e-45 4.e-45]

float32

不要用float代替np.float,否则可能出现意想不到的错误

不能从np.float64位转化np.float32,会报错

np.float64与np.float32相乘,结果为np.float64

在实际使用过程中,可以指定为np.float,也可以指定具体的位数,如np.float,不过直接指定np.float更方便。

torch数据类型转化

torch使用torch.float()转化数据类型,float默认转化为32位,torch中没有torch.float64()这个方法

# torch转化float类型
b = torch.tensor([4,5,6])
b = b.float()
b.dtype
torch.float32

np.float64使用torch.from_numpy转化为torch后也是64位的

print(a.dtype)
c = torch.from_numpy(a)
c.dtype

float64

torch.float64

不要用float代替torch.float,否则可能出现意想不到的错误

torch.float32与torch.float64数据类型相乘会出错,因此相乘的时候注意指定或转化数据float具体类型

np和torch数据类型转化大体原理一样,只有相乘的时候,torch.float不一致不可相乘,np.float不一致可以相乘,并且转化为np.float64

numpy和tensor互转

tensor转化为numpy

import torch
b = torch.tensor([4.0,6])
# b = b.float()
print(b.dtype)
c = b.numpy()
print(c.dtype)

torch.int64

int64

numpy转化为tensor

import torch
import numpy as np
b= np.array([1,2,3])
# b = b.astype(np.float)
print(b.dtype)
c = torch.from_numpy(b)
print(c.dtype)

int32

torch.int32

可以看到,torch默认int型是64位的,numpy默认int型是32位的

补充:torch.from_numpy VS torch.Tensor

最近在造dataset的时候,突然发现,在输入图像转tensor的时候,我可以用torch.Tensor直接强制转型将numpy类转成tensor类,也可以用torch.from_numpy这个方法将numpy类转换成tensor类,那么,torch.Tensor和torch.from_numpy这两个到底有什么区别呢?既然torch.Tensor能搞定,那torch.from_numpy留着不就是冗余吗?

答案

有区别,使用torch.from_numpy更加安全,使用tensor.Tensor在非float类型下会与预期不符。

解释

实际上,两者的区别是大大的。打个不完全正确的比方说,torch.Tensor就如同c的int,torch.from_numpy就如同c++的static_cast,我们都知道,如果将int64强制转int32,只要是高位转低位,一定会出现高位被抹去的隐患的,不仅仅可能会丢失精度,甚至会正负对调。

这里的torch.Tensor与torch.from_numpy也会存在同样的问题。

看看torch.Tensor的文档,里面清楚地说明了,

torch.Tensor is an alias for the default tensor type (torch.FloatTensor).

而torch.from_numpy的文档则是说明,

The returned tensor and ndarray share the same memory. Modifications to the tensor will be reflected in the ndarray and vice versa. The returned tensor is not resizable.

也即是说,

1、当转换的源是float类型,torch.Tensor与torch.from_numpy会共享一块内存!且转换后的结果的类型是torch.float32

2、当转换的源不是float类型,torch.Tensor得到的是torch.float32,而torch.from_numpy则是与源类型一致!

是不是很神奇,下面是一个简单的例子:

import torch
import numpy as nps1 = np.arange(10, dtype=np.float32)
s2 = np.arange(10) # 默认的dtype是int64# 例一
o11 = torch.Tensor(s1)
o12 = torch.from_numpy(s1)
o11.dtype # torch.float32
o12.dtype # torch.float32
# 修改值
o11[0] = 12
o12[0] # tensor(12.)# 例二
o21 = torch.Tensor(s2)
o22 = torch.from_numpy(s2)
o21.dtype # torch.float32
o22.dtype # torch.int64
# 修改值
o21[0] = 12
o22[0] # tensor(0)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用Python的Twisted框架实现webshell密码扫描器的教程
Apr 16 Python
wxPython中listbox用法实例详解
Jun 01 Python
20个常用Python运维库和模块
Feb 12 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
Feb 24 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
Python tkinter常用操作代码实例
Jan 03 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
Python3运算符常见用法分析
Feb 14 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 21 Python
Python学习之os包使用教程详解
Mar 21 Python
Python 用户输入和while循环的操作
May 23 #Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 #Python
python tkinter Entry控件的焦点移动操作
May 22 #Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 #Python
tensorboard 可视化之localhost:6006不显示的解决方案
pytorch训练神经网络爆内存的解决方案
粗暴解决CUDA out of memory的问题
May 22 #Python
You might like
第八节 访问方式 [8]
2006/10/09 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
php设计模式小结
2013/02/15 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
php的ddos攻击解决方法
2015/01/08 PHP
golang与php实现计算两个经纬度之间距离的方法
2016/07/22 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
[01:46]2018完美盛典章节片——坚守
2018/12/17 DOTA
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
社区优秀志愿者材料
2014/02/02 职场文书
销售员岗位职责范本
2014/02/03 职场文书
2014年基层党组织公开承诺书
2014/03/29 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
白血病募捐倡议书
2014/05/14 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python