解决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中的多行注释文档编写风格汇总
Jun 16 Python
Python实现批量更换指定目录下文件扩展名的方法
Sep 19 Python
利用Anaconda完美解决Python 2与python 3的共存问题
May 25 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
Python内建模块struct实例详解
Feb 02 Python
Python实现的爬虫刷回复功能示例
Jun 07 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
python实现多进程代码示例
Oct 31 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 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
PHP中for循环语句的几种变型
2007/03/16 PHP
php array_intersect()函数使用代码
2009/01/14 PHP
PHP 开源AJAX框架14种
2009/08/24 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
PHP中16个高危函数整理
2019/09/19 PHP
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
angularjs中的$eval方法详解
2017/04/24 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
2018/07/09 jQuery
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
办公室文员工作自我评价
2013/12/01 职场文书
校园安全广播稿范文
2014/09/25 职场文书
市场营销计划书范文
2015/01/16 职场文书
学期个人工作总结
2015/02/13 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
劳保用品管理制度范本
2015/08/06 职场文书