先给出torch和numpy转换的方式,之后参照W3C的一个教程,总结一些有用的。
Tensor与Numpy的ndarray类似,但深度学习框架又比Numpy的ndarray多一些重要功能: 首先,GPU很好地支持加速计算,而NumPy仅支持CPU计算; 其次,张量类支持自动微分。 这些功能使得张量类更适合深度学习。
torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
转numpy类型
转tensor
两者的区别
查看类型和转换
import torch
import numpy
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
(numpy.ndarray, torch.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)
使用 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.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_numpy | tensor.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类型下会与预期不符。
回到顶部