【问题标题】:How to apply a natural logarithm to a matrix and obtain zero for when the matrix entry is zero如何将自然对数应用于矩阵并在矩阵条目为零时获得零
【发布时间】:2019-09-26 05:49:14
【问题描述】:

在 Python 中,我有一个包含一些零值的矩阵,我如何应用自然对数并在矩阵条目为零时获得零?我正在使用 numpy.log(matrix) 来应用自然对数函数,但是当矩阵条目等于零时我得到 nan,我希望它为零

【问题讨论】:

  • 所有选项都很好,非常感谢

标签: python numpy natural-logarithm


【解决方案1】:

你可以这样做:

arr = numpy.nan_to_num(numpy.log(matrix))

nan_to_num 的行为将所有 NaN 替换为零。

您可以在此处找到更多信息:

另一种选择是将掩码传递给 np.log 函数的 where= 参数。

【讨论】:

    【解决方案2】:

    您可以使用 np.where。 seterr 是关闭警告。

    RuntimeWarning: divide by zero encountered in log

    在:

    np.seterr(divide = 'ignore')
    
    matrix = np.array([[10,0,5], [0,10,12]])
    np.where(matrix == 0, 0, np.log(matrix))
    

    输出:

    array([[2.30258509, 0.        , 1.60943791],
           [0.        , 2.30258509, 2.48490665]])
    

    【讨论】:

    • 通过关闭警告来实现所需的行为通常不是一个好习惯。
    • 在这种情况下没关系,这是 seterr 存在的众多原因之一。
    • 你也可以和np.errstate(divide='ignore'):一起使用
    【解决方案3】:

    您可以使用numpy.log1p,如果条目为零(因为 1 的日志为零)并且反向操作为 numpy.expm1,它将评估为零。

    您可以在文档中找到更多信息:

    1. Log1p
    2. Expm1

    【讨论】:

      【解决方案4】:

      np.log 是一个 ufunc,它接受一个 where 参数。这告诉它x 的哪些元素将用于计算。其余的被跳过。这最好与out 参数一起使用,如下所示:

      In [25]: x = np.array([1.,2,0,3,10,0])                                          
      In [26]: res = np.zeros_like(x)                                                 
      In [27]: idx = x>0                                                              
      In [28]: np.log(x)                                                              
      /usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in log
        #!/usr/bin/python3
      Out[28]: 
      array([0.        , 0.69314718,       -inf, 1.09861229, 2.30258509,
                   -inf])
      In [29]: np.log(x, out=res, where=idx)                                          
      Out[29]: 
      array([0.        , 0.69314718, 0.        , 1.09861229, 2.30258509,
             0.        ])
      

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        相关资源
        最近更新 更多