2017-04-15 83 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) 

这包括中移动所有拆下的列背后的数据。如果你想删除其中的多个,那么可以实现优化。 但这并不会缩小数组使用的内存。据我所知,如果不将所需的数据移到新的存储中,就不可能减少内存使用量。