【问题标题】:Ignoring negative values when using np.log(array)使用 np.log(array) 时忽略负值
【发布时间】:2014-09-18 07:08:42
【问题描述】:

当获取 numpy 数组中特定列的日志时,即logSFROIIdC = np.log(data_dC[:, 9]),编译器会返回错误:

-c:13: RuntimeWarning: divide by zero encountered in log.

现在,我知道为什么会发生这种情况,即 log(-1) = 数学错误。

但是,我希望能够调用某些东西或编写一些代码,然后跳过数组中可能导致此错误的任何值,然后完全忽略该行。允许该数据列再次可用。

我尝试了各种方法,这是向社区询问的最后手段。

【问题讨论】:

  • 刚刚检查,data_dC[:, 9] 的格式是否正确?
  • 这只是一个警告,因此您的程序将继续运行。如果您介意警告,可以使用warning 模块禁用它。
  • 优秀。是的,它是一个 9 列数组。一个大型数据集,可以制作许多多个图。

标签: python arrays numpy matplotlib logarithm


【解决方案1】:

您可以使用np.seterr 控制此行为。这是一个例子。

首先,告诉numpy忽略无效值:

In [4]: old = np.seterr(invalid='ignore')

现在log(-1) 不会产生警告:

In [5]: x = np.array([-1.,1])

In [6]: np.log(x)
Out[6]: array([ nan,   0.])

恢复之前的设置:

In [7]: np.seterr(**old)
Out[7]: {'divide': 'warn', 'invalid': 'ignore', 'over': 'warn', 'under': 'ignore'}

现在我们得到警告:

In [8]: np.log(x)
/Users/warren/anaconda/bin/ipython:1: RuntimeWarning: invalid value encountered in log
  #!/Users/warren/anaconda/python.app/Contents/MacOS/python
Out[8]: array([ nan,   0.])

还有一个上下文管理器np.errstate。例如,

In [10]: with np.errstate(invalid='ignore'):
   ....:     y = np.log(x)
   ....:     

In [11]: y
Out[11]: array([ nan,   0.])

【讨论】:

    【解决方案2】:

    您也可以使用掩码数组,NumPy 会在您执行np.log() 计算后自动为无效值应用掩码:

    a = np.array([1,2,3,0,4,-1,-2])
    b = np.log(np.ma.array(a))
    
    print(b.sum())
    # 3.17805383035
    

    np.ma.array(a) 正在创建一个没有屏蔽元素的屏蔽数组。它之所以有效,是因为 NumPy 在使用屏蔽数组的计算中会自动屏蔽 inf (or any invalid value) 的元素。

    或者,您可以自己创建面具(我推荐),例如:

    a = np.ma.array(a, mask=(a<=0))
    

    【讨论】:

      【解决方案3】:

      一个技巧是首先限制值为负数。 np.clip 救援。

      positive_array = np.clip(array, some_small_positive_value, None) 以避免数组中出现负值。虽然我不确定使值接近零是否符合您的目的。

      【讨论】:

        猜你喜欢
        • 2020-12-22
        • 2019-10-22
        • 2021-05-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多