2017-04-15 64 views
0

我想通過數組或索引張量刪除張量列。例如:火炬:通過索引刪除張量列

th> X = torch.rand(2,4) 

th> X 
0.7475 0.2512 0.6085 0.6414 
0.7143 0.8299 0.2929 0.6945 
[torch.DoubleTensor of size 2x4] 

th> indices = torch.zeros(2) 

th> indices[1] = 1 

th> indices[2] = 3 

th> indices 
1 
3 
[torch.DoubleTensor of size 2] 

th> X:delete(indices) 
0.2512 0.6414 
0.8299 0.6945 

回答

3

奇怪的是,這裏沒有內建函數。然而,這不是微不足道的操作。 火炬張量不一定以連續的方式存儲它們的數字,但它們絕對必須以週期性的方式存儲它,這是一個跨度必須保持不變的方向。

如果你需要沒有幾個行或列的張量,最簡單的方法是使用index

x=torch.Tensor{{1,2,3,4,},{5,6,7,8,}} 
y=x:index(2,torch.LongTensor{1,3,4}) 
--return: 
    1 3 4 
    5 7 8 

這將返回原來的張量副本,因爲沒有有效的方式來保持跟蹤所有應該跳過的元素。

如果你不想使用更多的內存,可以用切片和views擺脫列:

x[{{},{2,3}}]=x[{{},{3,4}}] 
x=x:view(2,3) 

這包括中移動所有拆下的列背後的數據。如果你想刪除其中的多個,那麼可以實現優化。 但這並不會縮小數組使用的內存。據我所知,如果不將所需的數據移到新的存儲中,就不可能減少內存使用量。