Indexing 张量的torch逻辑标引

Indexing 张量的torch逻辑标引,indexing,torch,Indexing,Torch,我正在寻找一种优雅的方法来选择满足某些约束的torch张量的子集。 例如,假设我有: A = torch.rand(10,2)-1 而S是一个10x1张量 sel = torch.ge(S,5) -- this is a ByteTensor 我希望能够进行逻辑索引,如下所示: A1 = A[sel] 但这不起作用。 因此有一个索引函数,它接受长传感器,但我找不到一种简单的方法将s转换为长传感器,除了以下几点: sel = torch.nonzero(sel) 它返回一个kx2张量(K是

我正在寻找一种优雅的方法来选择满足某些约束的torch张量的子集。 例如,假设我有:

A = torch.rand(10,2)-1
S
是一个10x1张量

sel = torch.ge(S,5) -- this is a ByteTensor
我希望能够进行逻辑索引,如下所示:

A1 = A[sel]
但这不起作用。 因此有一个
索引
函数,它接受
长传感器
,但我找不到一种简单的方法将
s
转换为
长传感器
,除了以下几点:

sel = torch.nonzero(sel)
它返回一个kx2张量(K是S>=5的值的数目)。因此,我必须将其转换为一维数组,这最终允许我索引a:

A:index(1,torch.squeeze(sel:select(2,1)))
这是非常麻烦的;在Matlab中,我所要做的就是

A(S>=5,:)

有人能提出更好的办法吗

一种可能的选择是:

sel = S:ge(5):expandAs(A)   -- now you can use this mask with the [] operator
A1 = A[sel]:unfold(1, 2, 2) -- unfold to get back a 2D tensor
例如:

> A = torch.rand(3,2)-1
-0.0047 -0.7976
-0.2653 -0.4582
-0.9713 -0.9660
[torch.DoubleTensor of size 3x2]

> S = torch.Tensor{{6}, {1}, {5}}
 6
 1
 5
[torch.DoubleTensor of size 3x1]

> sel = S:ge(5):expandAs(A)
1  1
0  0
1  1
[torch.ByteTensor of size 3x2]

> A[sel]
-0.0047
-0.7976
-0.9713
-0.9660
[torch.DoubleTensor of size 4]

> A[sel]:unfold(1, 2, 2)
-0.0047 -0.7976
-0.9713 -0.9660
[torch.DoubleTensor of size 2x2]

有两种更简单的选择:

  • 使用遮罩选择:

    result=A:maskedSelect(你的字节张量)

  • 例如,使用简单的元素乘法

    result=torch.cmul(A,S:gt(0))


  • 如果您需要保持原始矩阵(即A)的形状,例如选择backprop层中的神经元,则第二种方法非常有用。但是,由于每当ByteTensor指定的条件不适用时,它会在结果矩阵中放入零,因此不能使用它来计算乘积(或中值等)。第一个函数只返回满足条件的元素,所以这就是我用来计算乘积、中间值或任何其他我不需要零的东西

    很好,这是我错过的。虽然我认为通过重塑可以更直观地完成。谢谢