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的數組共享內存(即存儲區內存相同)。