使用np.log(数组)时忽略负值

时间:2014-07-26 15:19:11

标签: python arrays numpy matplotlib logarithm

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

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

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

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

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

3 个答案:

答案 0 :(得分:5)

您可以使用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.])

答案 1 :(得分:3)

您还可以使用蒙面数组,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会在带掩码数组的计算中自动屏蔽infor any invalid value)元素。

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

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

答案 2 :(得分:1)

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

positive_array = np.clip(array, some_small_positive_value, None)可以避免数组中出现负值。尽管我不确定将值设为零是否符合您的目的。