Torch:根据索引删除张量列

我想通过索引数组或张量删除张量列。例如:

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
点赞
用户4687565
用户4687565

奇怪的是,torch 没有内置函数可以实现这个操作。然而,这并不是简单的操作。Torch 张量不一定以连续的方式存储它们的数字,但它们必须以定期的方式存储,也就是说,步幅必须在维度上保持不变。

如果您需要一个没有几行或列的张量,最简单的方法是使用 index

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

这将返回原张量的一个 拷贝 ,因为没有有效的方法来跟踪应该被跳过的所有元素。

如果您不想使用额外的内存,可以使用切片和 views 来删除一列:

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

这将涉及将删除列后面的所有数据重新排列。如果您想删除多个列,那么可以采用优化方法。然而,这并不会缩小数组使用的内存。据我所知,不可能在不将所需数据移动到新存储区域的情况下减少内存使用。

2017-04-16 18:29:53