0402-Tensor和Numpy的区别
0402-Tensor和Numpy的区别
⽬录
由于tensor和ndarray具有很⾼的相似性,并且两者相互转化需要的开销很⼩。但是由于ndarray出现时间较早,相⽐较tensor有更多更简便的⽅法,因此在某些时候tensor⽆法实现某些功能,可以把tensor转换为ndarray格式进⾏处理后再转换为tensor格式。
⼀、tensor数据和ndarray数据相互转换
import numpy as np
a = np.ones([2, 3], dtype=np.float32)
a
array([[1., 1., 1.],
[1., 1., 1.]], dtype=float32)
b = t.from_numpy(a) # 把ndarray数据转换为tensor数据
b
tensor([[1., 1., 1.],
[1., 1., 1.]])
b = t.Tensor(a) # 把ndarray数据转换为tensor数据
b
tensor([[1., 1., 1.],
[1., 1., 1.]])
a[0, 1] = 100
b
tensor([[ 1., 100., 1.],
[ 1., 1., 1.]])
c = b.numpy() # 把tensor数据转换为ndarray数据
c
array([[ 1., 100., 1.],
[ 1., 1., 1.]], dtype=float32)
⼆、⼴播法则
⼴播法则来源于numpy,它的定义如下:
让所有输⼊数组都向其中shape最长的数组看齐,shape中不⾜部分通过在前⾯加1补齐
两个数组要么在某⼀个维度的长度⼀致,要么其中⼀个为1,否则不能计算
当输⼊数组的某个维度的长度为1时,计算时沿此维度复制扩充×⼀样的形状
torch当前⽀持⾃动⼴播法则,但更推荐使⽤以下两个⽅法进⾏⼿动⼴播,这样更直观,更不容出错:
unsqueeze或view:为数据某⼀维的形状补1
expand或expand_as:重复数组,实现当输⼊的数组的某个维度的长度为1时,计算时沿此维度复制扩充成⼀样的形状
注:repeat与expand功能相似,但是repeat会把相同数据复制多份,⽽expand不会占⽤额外空间,只会在需要的时候才扩充,可以极⼤地节省内存。
a = t.ones(3, 2)
b = t.zeros(2, 3, 1)
⾃动⼴播法则:
a是⼆维,b是三维,所在现在较⼩的a前⾯补1(等价于a.unsqueeze(0),a的形状变成(0,2,3))
由于a和b在第⼀维和第三维的形状不⼀样,利⽤⼴播法则,两个形状都变成了(2,3,2)
a + b
tensor([[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
trunc函数和int[1., 1.]]])
对上述⾃动⼴播可以通过以下⽅法实现⼿动⼴播
a.unsqueeze(0).expand(2, 3, 2) +
2, 3, 2) # 等价于a.view(1,3,2).expand(2,3,2) + b.expand(2,3,2) tensor([[[1., 1.],
[1., 1.],
[1., 1.]],
[[1., 1.],
[1., 1.],
[1., 1.]]])
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论