【问题标题】:Replace all nonzero values by zero and all zero values by a specific value用零替换所有非零值,用特定值替换所有零值
【发布时间】:2018-01-05 04:24:56
【问题描述】:

我有一个 3d 张量,其中包含一些零值和非零值。我想用零替换所有非零值,用特定值替换零值。我该怎么做?

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    你会如何使用 numpy 做到这一点,就像这样:

    tensor[tensor!=0] = 0
    

    为了替换零和非零,您可以将它们链接在一起。请务必使用张量的副本,因为它们会被修改:

    def custom_replace(tensor, on_zero, on_non_zero):
        # we create a copy of the original tensor, 
        # because of the way we are replacing them.
        res = tensor.clone()
        res[tensor==0] = on_zero
        res[tensor!=0] = on_non_zero
        return res
    

    然后像这样使用它:

    >>>z 
    (0 ,.,.) = 
      0  1
      1  3
    
    (1 ,.,.) = 
      0  1
      1  0
    [torch.LongTensor of size 2x2x2]
    
    >>>out = custom_replace(z, on_zero=5, on_non_zero=0)
    >>>out
    (0 ,.,.) = 
      5  0
      0  0
    
    (1 ,.,.) = 
      5  0
      0  5
    [torch.LongTensor of size 2x2x2]
    

    【讨论】:

    • 注意这个操作是不可微的!因此不会发生反向传播。
    【解决方案2】:

    使用

    torch.where(<your_tensor> != 0, <tensor with zeroz>, <tensor with the value>)
    

    例子:

    >>> x = torch.randn(3, 2)
    >>> y = torch.ones(3, 2)
    >>> x
    tensor([[-0.4620,  0.3139],
             [ 0.3898, -0.7197],
             [ 0.0478, -0.1657]])
    >>> torch.where(x > 0, x, y)
    Tensor([[ 1.0000,  0.3139],
            [ 0.3898,  1.0000],
            [ 0.0478,  1.0000]])
    

    查看更多信息:https://pytorch.org/docs/stable/generated/torch.where.html

    【讨论】:

      【解决方案3】:

      这可以在不克隆张量并使用零值和非零值索引的情况下完成:

      zero_indices = tensor == 0
      non_zero_indices = tensor != 0
      tensor[non_zero_indices] = 0
      tensor[zero_indices] = value
      

      【讨论】:

        猜你喜欢
        • 2016-03-06
        • 2015-08-24
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 2019-11-05
        相关资源
        最近更新 更多