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的区别】
在这里插入图片描述

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


总结

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

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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Pandas中,数据类型转换是非常常见的操作,因为Pandas DataFrame中的每个元素都有其默认的数据类型,但有时我们可能需要将数据从一种类型转换为另一种类型。Pandas提供了多种方法来进行这个转换: 1. **astype()** 函数:这是最常用的方法,用于将一个列或整个DataFrame的数据类型转换为指定的类型。例如,你可以将一列字符串转换为整数、浮点数或日期类型。 ```python # 例如,将整数列转换为浮点数 df['column_name'] = df['column_name'].astype(float) ``` 2. **to_numeric()** 函数:适用于处理非数字字符串(如'10'、'10.5'等),可以将其转换为数值类型。 ```python df['column_name'] = pd.to_numeric(df['column_name'], errors='coerce') ``` 这里,`errors='coerce'`会让无法转换的值变为NaN(Not a Number)。 3. **apply()** 函数:如果需要更复杂的转换逻辑,可以使用此函数结合lambda表达式或其他转换函数对每一项进行转换。 ```python def convert_to_date(date_string): # 日期格式化规则根据实际情况自定义 return pd.to_datetime(date_string, format='%Y-%m-%d') df['date_column'] = df['date_column'].apply(convert_to_date) ``` 4. **convert_objects()** 函数(在Pandas版本 < 1.0.0 中使用):这是早期版本中用于自动检测并转换非数值类型的函数,但在新版本中已被弃用。 5. **infer_dtype()** 函数(在Pandas版本 >= 1.0.0 中使用):这是一个辅助函数,用于推断列的数据类型,但通常不直接用于类型转换,而是用来检查数据是否符合预期。 在进行类型转换时,要注意保持数据的一致性和准确性,避免丢失信息或引入错误。还要考虑到异常处理,比如空值(NaN)的处理。此外,确保你知道数据的原始类型以及你希望转换到的目标类型之间的关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值