Python各种数据类型转化


前言

本文主要介绍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的区别】
在这里插入图片描述

扫描二维码关注公众号,回复: 15141212 查看本文章

首先看一下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】。
  • 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之间


总结

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

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

猜你喜欢

转载自blog.csdn.net/m0_46366547/article/details/129233059