Python各种数据类型转化

文章目录

  • 前言
  • 一、Numpy
    • (1)numpy 转化为tensor
    • (2)numpy 转化为list
    • (3)numpy 转化为PIL.Image数据类型
    • (4)numpy 转化为pandas数据类型
  • 二、Tensor
    • (1)万能转换方法:torch.as_tensor()方法,将其他类型转换为tensor类型。
    • (2)tensor 转化为numpy
    • (3)tensor在cpu和gpu上的转换
      • 1.从CPU转换到GPU
      • 2.从GPU转换到CPU
    • (4)tensor转换成标量
    • (5)tensor转换成List
  • 三、读取图片时的数据类型
    • (1)cv2
    • (2)PIL
      • 1.PIL转换成tensor
  • 总结

前言

本文主要介绍Python一些常见的数据格式之间的转换方法,尤其是和Pytorch中tensor类型进行相关转换的数据操作。

一、Numpy

Numpy创建的默认浮点类型是np.float64
Numpy创建的整数ndarrays是np.int32

(1)numpy 转化为tensor

1.直接使用torch.tensor函数——–深拷贝

2.使用torch.from_numpy方法——浅拷贝

这两个方法比较而言,使用torch.from_numpy方法更好,更安全。

当只有一个元素(size =1)时,利用item()方法可以转化标量。

(2)numpy 转化为list

1.numpy自带函数 nump.tolist()——要注意列表中数据的维度

(3)numpy 转化为PIL.Image数据类型

1.使用Image.fromarray()方法

注意:Image.fromarray()对输入的dtype的要求是uint8类型

(4)numpy 转化为pandas数据类型

1.使用pd.DataFrame()方法

二、Tensor

torch中tensor默认的浮点类型是float32类型
torch中tensor默认的整数类型是int64类型
【注意和numpy的区别】

首先看一下torch.tensor()和torch.Tensor()这两个方法。两者都是深拷贝方法,返回张量的同时,与原数据不共享内存,因此不受原数据改变的影响

再来了解一下的区别:

  • torch.Tensor()是torch.FloatTensor()的别名,是一个python类,所有的tensor 都是torch.Tensor的实例。将输入转换为torch.FloatTensor()
  • torch.tensor()是一个函数。根据输入的数据类型转换为对应的数据类型。

创建空的tensot的方法:

#两种方法
torch.Tensor()
torch.tensor(())

(1)万能转换方法:torch.as_tensor()方法,将其他类型转换为tensor类型。

torch.as_tensor(data, dtype=None, device=None)->Tensor

data:可以是list, tuple, ndarray, scalar等类型
dtype:可以指定tensor中数据的类型,
device:指定返回tensor所在的位置,默认是cpu

注意:torch.as_tensor()默认情况下是一个浅拷贝方法,当指定的dtype和data的类型不一致时才是深拷贝。

(2)tensor 转化为numpy

1.使用 .numpy 函数——–浅拷贝

2.使用 torch.Tensor.numpy() 函数——–浅拷贝

(3)tensor在cpu和gpu上的转换

在使用Pytorch训练的过程中经常要将数据放到gpu上训练,或者是将GPU上训练好的模型数据放在cpu上测试。所以tensor类型经常要来回转换,下面简单介绍一些之间的转换方法。

1.从CPU转换到GPU

1.使用 .cuda()方法

2.使用torch.set_default_tensor_type() 方法,将默认的浮点类型设置为cuda类型。

2.从GPU转换到CPU

#把数据转到CPU----.cpu()方法
gpu_tensor.cpu()

常用写法:
若gpu存在,则放到gpu上;否则放在cpu上。

device = torch.device('cuda' if torch.cuda.is_available()  else 'cpu')
tensor1 = tensor1.to(device)
tensor2 = tensor2.to(device)
#......

(4)tensor转换成标量

和前面一样,使用item()方法

(5)tensor转换成List

1.tolist方法

三、读取图片时的数据类型

(1)cv2

读取图像时主要使用cv2.imread() 函数
用法为:

img = cv2.imread(filename, flags)
#filename:图片路径
#flags:读取图片的格式。默认为1:彩色图片;0:灰度图片;

而且返回的是numpy类型。

注意

  • cv2.imread()函数读取的图片通道保存顺序为BGR,不是RGB。使用cv2.imshow()可以正常显示,使用其他库显示时要进行转换。
  • 对cv2.imread()读取的图像转换成数组后的形状是【H,W,C】;而Pytorch中要求输入的形状是【B,C,H,W】。
    而在利用深度学习训练的过程中,经常要将numpy数组转换为Tensor类型,我们可以采用tensor = torchvision.transforms.ToTensor()(numpy)就可以实现这个转换。但是最好不要采用下面方法进行转换,虽然也行,但是可能会导致图片出现一些失真的问题。👀
# 假设img为numpy数组
img = np.transpose(img,(2,0,1))
img = torch.tensor(img,dtype=torch.float).cuda()
img = img.unsqueeze(0)
  • cv2.imread()不支持中文路径,如果不想改路径名称,可以按照以下方法读取:
import numpy as np
import cv2
img=cv2.imdecode(np.fromfile(imgpath, dtype=np.uint8), cv2.IMREAD_COLOR)
  • 使用cv2.imshow()显示时可能出现图片一闪而过的情况,可以添加一行语句:cv2.waitKey(0);而且imshow()中的第一个窗口名称不能省略。

    正确显示:

(2)PIL

读取和显示图像方法如下:

from PIL import Image
img = Image.open('E:\A.png')
img.show()
print(type(img))

输出:PIL.PngImagePlugin.PngImageFile

  • Image读取的图片格式是 W x H格式的,读入的是“RGB”,转换成numnpy后的shape大小为
    C,H,W

1.PIL转换成tensor

要用到pytorch里的图形库torchvision,而torchvision.transforms主要是用于常见的一些图形变换。

用法如下:
别写成了:torchvision.transforms.ToTensor(img)

注意:ToTensor()方法转化为tensor时会把灰度范围从0-255变换到0-1之间

总结

提示:这里对文章进行总结:

其实还有很多内容,后续再补充。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年11月14日
下一篇 2023年11月14日

相关推荐