Numpy/Pytorch之数据类型与强制转换 总结

您所在的位置:网站首页 ndarray转换数据类型 Numpy/Pytorch之数据类型与强制转换 总结

Numpy/Pytorch之数据类型与强制转换 总结

2024-07-12 00:21| 来源: 网络整理| 查看: 265

Numpy/Pytorch之数据类型与强制转换 总结 numpy的数据创建和类型转换Torch的数据创建和类型转换Numpy和Torch之间相互转换1.利用专门设计的函数,进行转换:2.直接利用数据创建矩阵(不能称为类型转换,是新建数据):

禁止转载!!!

numpy的数据创建和类型转换

① 用一维列表创建

import numpy as np np.array([1,2,3])

② 用元组创建

np.array((1,2,3))

③ 创建多维数组

np.array( [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ] ] )

④通过zeros创建数组 创建一个元素为0的数组

np.zeros(3) #生成一维矩阵 np.zeros((3,3)) #生成二维矩阵 np.zeros(((2,3,4))) #生成三维矩阵

⑤ones 生成元素为1的数组

np.ones((3, 3)) 左行右列,三行三列

⑥empty生成未初始化数组

np.empty((2,2))

此外,还可以产生与现有矩阵相同形状的矩阵:

np.zeros_like(a) np.ones_like(a) np.empty_like(a) #a为现有的矩阵

numpy的数据类型: dtype属性

Python的type()函数:返回的是变量类型,而非数据类型。如:a.type() type(a) 使用dtype不仅可以查看其数据类型,还可以设置其数据类型:

a=np.array((1,2,3)) a.dtype ## dtype('int32') a=np.array((1,2,3),dtype=float) a.dtype ##dtype('float64') ##将原类型转换数据类型 a=np.array(a,dtype=np.int8) #注意!!!! python中没有int8 所以必须用np.int8 其他同理 a.dtype #dtype('int8')

利用.astype()方法也行

a=a.astype(np.int16) a.dtype #dtype('int16')

NumPy 支持比 Python 更多种类的数值类型。 下表显示了 NumPy 中定义的不同标量数据类型。 注意!!!! python中没有int8 所以必须用np.int8 其他同理。 在这里插入图片描述

Torch的数据创建和类型转换

1.利用torch.tensor来创建 ①一维列表创建 用元组创建 多维数组 (类似于numpy.array())

import torch torch.tensor([1,2,3]) torch.tensor((1,2,3)) torch.tensor( [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ] ] )

②通过zeros创建数组 创建元素为0的 生成元素为1的 生成未初始化的 (类似于numpy)

torch.zeros(3) #生成一维矩阵 torch.zeros((3,3)) #生成二维矩阵 torch.zeros(((2,3,4))) #生成三维矩阵 torch.ones((3, 3)) 左行右列,三行三列 torch.empty((2,2))

此外,还可以产生与现有矩阵相同形状的矩阵: (类似于numpy,除torch.full_like)

torch.zeros_like(a) torch.ones_like(a) torch.empty_like(a) torch.full_like(a,full_like_value) #a为现有的矩阵

2.利用torch.Tensor来创建 (与numpy不同) 大写的Tensor是用来接收shape的,不过也可以接受list数据,建议用tensor接受list数据,Tensor接收Shape。(注意:未初始化的张量数据特别大或者特别小,如果后面不赋值替换,那么容易出错/网络收敛不够好。)

b=torch.Tensor(1,2,2) b.size() #torch.Size([1, 2, 2]) #也是可以指定类型的 b=torch.FloatTensor(1,2,2) b.dtype #torch.float32

Torch的数据类型: 😃 既然前面都和numpy神似,那么dtype的用法也当然是神似了: 😃

a=torch.tensor((1,2,3)) a.dtype #torch.int64 a=torch.tensor((1,2,3),dtype=float) a.dtype #torch.float64 #区别: 但是并不允许 a=torch.tensor(a,dtype=float)

数据类型转换:(这里是numpy有些差别)

a.int(), a.long(), a.short(), a.float(), a.double(), a.half(), a.char(), a.byte() 进行转化 a = torch.tensor([1.3,4.6]) b = a.byte() #tensor([1, 4], dtype=torch.uint8) 使用torch.type()函数, 直接输入需要转化成的类型 (类似np.astype()) a = torch.tensor([1.3,4.6]) b = a.type(torch.short) a = a.type(torch.short) 使用type_as() 函数, 该函数的作用是将该tensor的类型转化成另一个tensor的类型 a = torch.tensor([1.3,4.6]) b = torch.tensor([2,4],dtype=torch.short) c = a.type_as(b)

在torch中CPU和GPU张量分别有8种数据类型, GPU tensor比CPU tensor多了.cuda 在这里插入图片描述

Numpy和Torch之间相互转换

前面介绍完,各自内部的数据转换,现在介绍一下两者相互的数据转换。

1.利用专门设计的函数,进行转换:

注意,转换后的tensor与numpy指向同一地址,对一方的值改变另一方也随之改变!!!

tensor转numpy:

a = torch.ones(3) b = a.numpy() a.add_(1.) print('a:',a) print('b:',b)

a: tensor([2., 2., 2.]) #跟着改变了 b: [2. 2. 2.]

numpy转tensor:

a = np.ones(5) b = torch.from_numpy(a) 2.直接利用数据创建矩阵(不能称为类型转换,是新建数据):

创建的数据与原数据不是同一地址的数据!!! tensor转numpy:

a = torch.tensor([1,1]) b=np.array(a) a.add_(1) print('a:',a) #a: tensor([2., 2.]) b: [1. 1.] 没有跟着改变数据 print('b:',b) #还可以指定数据类型 b=np.array(a,dtype=np.int8)

numpy转tensor:

a=np.array([1.,1.]) b=torch.tensor(a,dtype=torch.int8) c=torch.Tensor(a) #需要注意:使用t.Tensor()进行转换,发现Numpy的数据类型和Tensor的一致,会共享内存!! 其他情况不会

在这里插入图片描述 torch.ones_like(a)这种特殊创建方法,不能进行创建。 TypeError:`ones_like(): argument 'input' (position 1) must be Tensor, not numpy.ndarray 但是,np.ones_like(a)是可以的:

a=torch.tensor([1,1],dtype=float) b=np.ones_like(a)

总之,两者在使用上有很大的相似之处,细微的差别可以对比记忆。大方向上,torch都是依照着numpy来设计的,并为了便于深度学习的计算加入了很多新方法和属性。 欢迎留言交流,but禁止转载!!!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3