解决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爬虫代理IP快速增加博客阅读量
Dec 14 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
Python中property函数用法实例分析
Jun 04 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
flask session组件的使用示例
Dec 25 Python
Python实现Event回调机制的方法
Feb 13 Python
Django 数据库同步操作技巧详解
Jul 19 Python
Python Django Cookie 简单用法解析
Aug 13 Python
Python3 翻转二叉树的实现
Sep 30 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 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数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
JS之小练习代码
2008/10/12 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
Angularjs 基础入门
2014/12/26 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
班组长安全生产职责
2013/12/16 职场文书
工作室成员个人发展规划范文
2014/01/24 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫