解决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 os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
Java分治归并排序算法实例详解
Dec 12 Python
python 保存float类型的小数的位数方法
Oct 17 Python
Python中Numpy mat的使用详解
May 24 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
Python字典实现伪切片功能
Oct 28 Python
Python中requests做接口测试的方法
May 30 Python
python基础之错误和异常处理
Oct 24 Python
python使用shell脚本创建kafka连接器
Apr 29 Python
Python实现仓库管理系统
May 30 Python
Python使用Web框架Flask开发项目
Jun 01 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
日本十大惊悚动漫
2020/03/04 日漫
支持oicq头像的留言簿(二)
2006/10/09 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
js读写json文件实例代码
2014/10/21 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
angularjs实现搜索的关键字在正文中高亮出来
2017/06/13 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
Python下载网络小说实例代码
2018/02/03 Python
Python中协程用法代码详解
2018/02/10 Python
python命令行工具Click快速掌握
2019/07/04 Python
使用python实现滑动验证码功能
2019/08/05 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
Python实现仿射密码的思路详解
2020/04/23 Python
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
爱国之歌(8首)
2019/09/29 职场文书
解决IIS7下无法绑定https主机的问题
2022/04/29 Servers