【问题标题】:How to replace every row that are filled with zero with a certain value from a Pytorch tensor?如何用 Pytorch 张量中的某个值替换每一行填充为零的行?
【发布时间】:2020-12-19 20:31:21
【问题描述】:

我有一个大小为 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],

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

【问题讨论】:

    标签: python pytorch vectorization tensor


    【解决方案1】:

    假设 x 是您的张量 BxRxC(批次、行和列),您可以执行以下操作:

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

    基本上:

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

    【讨论】:

    • 哦,我明白了,all 函数上有一个维度 arg。我不知道那件事。让我试试这个并快速标记它是正确的。
    • 工作得很好!非常感谢让我避免了张量 obj 上的讨厌循环
    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2019-12-24
    相关资源
    最近更新 更多