解决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的循环体中使用else语句的方法
Mar 30 Python
python比较2个xml内容的方法
May 11 Python
django 将model转换为字典的方法示例
Oct 16 Python
在Python中,不用while和for循环遍历列表的实例
Feb 20 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
关于sys.stdout和print的区别详解
Dec 05 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
自学python用什么系统好
Jun 23 Python
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
Apr 12 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
Python基础之数据类型知识汇总
May 18 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 文件上传功能实现代码
2009/06/24 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python random模块用法解析及简单示例
2017/12/18 Python
python+pandas生成指定日期和重采样的方法
2018/04/11 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
管理学专业个人求职信范文
2013/09/21 职场文书
求职简历推荐信范文
2013/12/02 职场文书
单位介绍信范文
2014/01/18 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
党员剖析材料范文
2014/09/30 职场文书
个园导游词
2015/02/04 职场文书
电子商务专业求职信范文
2015/03/19 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang