tensor分为头信息区(Tensor)和存储区(Storage)。信息区主要保存着tensor的形状(size)、步长(stride)、数据类型(type)等信息,而真正的数据则保存成连续数组,存储在存储区。
通过id(tensor.storage)来获取“存储区”,注意:id(tensor)与id(tensor.storage)不同,id(tensor)是整个tensor所占的内存地址(包括信息区和存储区),而 id(tensor.storage)只是该tensor存储区的内存地址,也就是说某几个tensor的存储区的内存地址可以相同(即他们共享数据)。
1,切片操作:
索引出来的结果与原数据共享内存(存储区内存地址相同,总内存地址不同)。
[In]: x=torch.zeros(2,2) # x: [ [ 0,0]
[0,0] ]
y=x[0,:]
y+=1
print(y)
print(x)
print(id(y)==id(x))
print(id(y.storage)==id(x.storage))
[Out]:
y:[[1,1]]
x:[[1,1]
[0,0]]
False
True
2, view方法:
view可以用来改变tensor的形状,返回新的tensor。
返回的tensor与原数据共享data,即存储区内存地址相同,总内存地址不同
[In] x=torch.zeros(2,2) # x: [ [ 0,0]
[0,0] ]
y=x.view(4,1)
y+=1
print(y)
print(x)
print(id(y)==id(x))
print(id(y.storage)==id(x.storage))
[Out] y: [[1][1][1][1]]
x: [[1, 1]
[1,1]]
False
True
3 detach,data方法:
与tensor全切片时相同。
4 numpy,from_numpy方法
该方法将tensor与numpy相互转换,这两个函数所产生的tensor与numpy的数组共享内存(即存储区内存相同)。