当前位置: 首页 > 工具软件 > np > 使用案例 >

np和tensor转换

封永嘉
2023-12-01

说明

先给出torch和numpy转换的方式,之后参照W3C的一个教程,总结一些有用的。

Tensor与Numpy的ndarray类似,但深度学习框架又比Numpy的ndarray多一些重要功能: 首先,GPU很好地支持加速计算,而NumPy仅支持CPU计算; 其次,张量类支持自动微分。 这些功能使得张量类更适合深度学习。
torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。

代码

numpy转tensor

转numpy类型

  • .numpy()

转tensor

  • torch.tensor()
  • torch.from_numpy()

两者的区别
查看类型和转换

import torch
import numpy
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

(numpy.ndarray, torch.Tensor)

tensor 转换标量

将大小为1的张量转换为Python标量,我们可以调用item函数或Python的内置函数。

a = torch.tensor([3.5])
a, a.item(), float(a), int(a)

(tensor([3.5000]), 3.5, 3.5, 3)

numpy数据类型转化

使用 astype

#numpy转化float类型
a= np.array([1,2,3])
a = a.astype(np.float)
print(a)
print(a.dtype)

注意有损失的转换方式:使用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

np.float64使用torch.from_numpy转化为torch后也是64位的

print(a.dtype)
c = torch.from_numpy(a)
c.dtype

torch.float32与torch.float64数据类型相乘会出错,因此相乘的时候注意指定或转化数据float具体类型

区别

np和torch数据类型转化大体原理一样,只有相乘的时候,torch.float不一致不可相乘,np.float不一致可以相乘,并且转化为np.float64.

两者的区别

torch.from_numpytensor.Tensor
安全float安全

使用torch.from_numpy更加安全,使用tensor.Tensor在非float类型下会与预期不符。

打个不完全正确的比方说,torch.Tensor就如同c的int,torch.from_numpy就如同c++的static_cast,我们都知道,如果将int64强制转int32,只要是高位转低位,一定会出现高位被抹去的隐患的,不仅仅可能会丢失精度,甚至会正负对调。

1、当转换的源是float类型,torch.Tensor与torch.from_numpy会共享一块内存!且转换后的结果的类型是torch.float32

2、当转换的源不是float类型,torch.Tensor得到的是torch.float32,而torch.from_numpy则是与源类型一致!

使用torch.from_numpy更加安全,使用tensor.Tensor在非float类型下会与预期不符。
回到顶部

参考文章

numpy和torch数据类型怎么转化
pytorch的一些数据操作(李沐)

 类似资料: