解决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查询示例
Mar 26 Python
python使用多线程不断刷新网页的方法
Mar 31 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
使用python脚本实现查询火车票工具
Jul 19 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
django之自定义软删除Model的方法
Aug 14 Python
python中的itertools的使用详解
Jan 13 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
用python批量下载apk
Dec 29 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 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
自己做矿石收音机
2021/03/02 无线电
php GD绘制24小时柱状图
2008/06/28 PHP
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
Python抓取百度查询结果的方法
2015/07/08 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
python实现控制台打印的方法
2019/01/12 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
计算机系毕业生推荐信
2013/11/06 职场文书
员工拓展培训方案
2014/02/15 职场文书
安全施工责任书
2014/08/25 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
设备收款委托书范本
2014/10/02 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript