torch里面的Tensor、as_tensor、tensor以及from_numpy究竟有何区别?

导读

在使用pytorch的时候我们经常会用到将numpy array转为tensor,以及将tensor转为numpy array的情况。pytroch内置了几种不同的方法可以方便我们将numpy array转换称为tensor,那么这些方法之间究竟有何异同呢?下面我们就来介绍一下

实践

import torch
import numpy as np

#创建一个numpy array的数组
array = np.array([1,2,3,4])

#将numpy array转换为torch tensor
tensor = torch.tensor(array)
Tensor = torch.Tensor(array)
as_tensor = torch.as_tensor(array)
from_array = torch.from_numpy(array)

print(array.dtype)      #int64
#查看torch默认的数据类型
print(torch.get_default_dtype())    #torch.float32

#对比几种不同方法之间的异同
print(tensor.dtype)     #torch.int64
print(Tensor.dtype)     #torch.float32
print(as_tensor.dtype)  #torch.int64
print(from_array.dtype) #torch.int64

我们通过初步的实践分析发现,只有Tensor方法创建的tensor使用了torch的默认数据类型,而其他三种方法都使用了numpy array中的int64数据类型

接下来我们进一步分析,如果我们改变数组的值,会发生什么事情

#创建一个numpy array的数组
array = np.array([1,2,3,4])

#将numpy array转换为torch tensor
tensor = torch.tensor(array)
Tensor = torch.Tensor(array)
as_tensor = torch.as_tensor(array)
from_array = torch.from_numpy(array)

#修改数组的值
array[0] = 10

#打印结果
print(tensor)       #tensor([1, 2, 3, 4])
print(Tensor)       #tensor([1., 2., 3., 4.])
print(as_tensor)    #tensor([10,  2,  3,  4])
print(from_array)   #tensor([10,  2,  3,  4])

通过上面的例子发现,as_tensor方法from_array方法转换的tensor的值都发生了改变,说明其实它们使用的数据和numpy array使用的数据是一样的,也就是说它们和numpy array其实是共享内存的。而Tensor方法tensor方法在转换的时候,则是开辟了新的内存空间来存储tensor的。

总结:所以as_tensorfrom_array是浅拷贝,而tensorTensor则是属于深拷贝,如果我们不会去改变数组里面的数据时,建议采用浅拷贝,这样效率会更高点,因为它们是共享内存的。但是,如果我们有对转换后的tensor做类似fill_scatter_这样的操作时,就需要注意是否能够使用as_tensorfrom_array了。

关于torch中的fill_和scatter_

torh里面包含了很多类似于fill_scatter_方法,带_的方法都是直接修改tensor的内容的。如果我们再转换numpy array时采用的是from_arrayas_tensor就会导致numpy array里面的值也被修改

#创建一个numpy array的数组
array = np.array([1,2,3,4])

#将numpy array转换为torch tensor
tensor = torch.tensor(array)
Tensor = torch.Tensor(array)
as_tensor = torch.as_tensor(array)
from_array = torch.from_numpy(array)

# 修改tensor的内容
fill_tensor = tensor.fill_(0)
print(fill_tensor)          #tensor([0, 0, 0, 0])
print(array)                #[1 2 3 4]
fill_Tensor = Tensor.fill_(1)
print(fill_Tensor)          #tensor([1., 1., 1., 1.])
print(array)                #[1 2 3 4]
fill_as_tensor = as_tensor.fill_(2)
print(fill_as_tensor)       #tensor([2, 2, 2, 2])
print(array)                #[2 2 2 2]
fill_from_array = from_array.fill_(3)
print(fill_from_array)      #tensor([3, 3, 3, 3])
print(array)                #[3 3 3 3]

因为from_arrayas_tensor和numpy array是共享内存的,所以当修改tensor里面的值时numpy array也会被修改

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修炼之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值