解决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生成器generator之next和send的运行流程(详解)
May 08 Python
python之Character string(实例讲解)
Sep 25 Python
python如何在循环引用中管理内存
Mar 20 Python
python pexpect ssh 远程登录服务器的方法
Feb 14 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
python requests使用socks5的例子
Jul 25 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
Dec 11 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
解决python运行启动报错问题
Jun 01 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 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
destoon整合UCenter图文教程
2014/06/21 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
python爬虫获取新浪新闻教学
2018/12/23 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
2019/09/20 Python
Python中base64与xml取值结合问题
2019/12/22 Python
python os模块在系统管理中的应用
2020/06/22 Python
python如何随机生成高强度密码
2020/08/19 Python
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
美术师范毕业生自荐信
2013/11/16 职场文书
大学生专科毕业生自我评价
2013/11/17 职场文书
班级体育活动总结
2014/07/05 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
矛盾论读书笔记
2015/06/29 职场文书
公司保密管理制度
2015/08/04 职场文书
八年级语文教学反思
2016/03/03 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript