如何用Pytorch张量中的某个值替换用零填充的每一行?

时间:2020-08-31 17:37:17

标签: python pytorch vectorization tensor

我有一个bsize x 50 x 50大小的Pytorch张量,其中某些行完全用零填充:

         [[0, 2, 0,  ..., 0, 0, 0],
         [2, 0, 2,  ..., 0, 0, 0],
         [0, 2, 0,  ..., 0, 0, 0],
         ...,
         [0, 0, 0,  ..., 0, 0, 0],
         [0, 0, 0,  ..., 0, 0, 0],
         [0, 0, 0,  ..., 0, 0, 0]],

        [[0, 2, 0,  ..., 0, 0, 0],
         [2, 0, 2,  ..., 0, 0, 0],
         [0, 2, 0,  ..., 0, 0, 0],

我想在整个张量中用负值-100替换用零填充的行。 预期张量-

         [[0, 2, 0,  ..., 0, 0, 0],
         [2, 0, 2,  ..., 0, 0, 0],
         [0, 2, 0,  ..., 0, 0, 0],
         ...,
         [-100, -100, -100,  ..., -100,-100, -100],
         [-100, -100, -100,  ..., -100,-100, -100],
         [-100, -100, -100,  ..., -100,-100, -100]],

        [[0, 2, 0,  ..., 0, 0, 0],
         [2, 0, 2,  ..., 0, 0, 0],
         [0, 2, 0,  ..., 0, 0, 0],

什么是避免在行形状上循环的最佳方法?

1 个答案:

答案 0 :(得分:3)

假设xBxRxC的张量(批,行和列),则可以执行以下操作:

x[(x == 0).all(dim=-1)] = -100

基本上:

  • x == 0返回一个布尔张量(形状为BxRxC),其中True等于零;
  • 然后,.all(dim=-1)返回另一个布尔张量,现在的形状为BxR,因为我们选择在最后一个维度(all)中对{{1}做-1 },其中所有列为True
  • 最后,我们使用此布尔张量索引原始张量,并将True分配到-100位置。