Numpy:如何在没有警告的情况下计算日志?

时间:2017-02-27 08:43:40

标签: python numpy

我刚刚升级到Anaconda的新版本,其中

%matplotlib inline

from numpy import inf, arange, array, linspace, exp, log, power, pi, cos, sin, radians, degrees
from matplotlib import pyplot as plt
x = linspace(0, 10)
plt.plot(x, log(x),'o', label='ECDF')

工作正常,但会返回警告

RuntimeWarning: divide by zero encountered in log

当然,问题是我使用x = linspace(0, 10),从0开始,然后将其传递给log(x)。但问题是,我怎样才能重构我的代码,所以警告会消失?

一般来说,大多数情节总是从0开始。像x = linspace(0.00000001, 10)这样的东西对我来说非常难看。

2 个答案:

答案 0 :(得分:1)

对数未在0中定义,因此您无法在零处绘制该函数的图形。我看到的一个选项是,不是绘制log(x),而是绘制一个更复杂的函数:

lambda x: log(x) if x > 0 else 0

当然你可以为x = 0选择不同的值,但我认为0是有意义的。

使用linspace的参数,可以排除最后一点(使用x = linspace(0, 10, endpoint=False)),但我认为没有办法排除起点。

答案 1 :(得分:0)

Numpy提供了一种很好的机制,可以使用errstate来抑制警告,仅在与with一起使用时才适用于本地。

with np.errstate(divide = 'ignore'):
    plt.plot(x, np.log(x),'o', label='ECDF')

但是,只有当您无法“手动”修改代码以避免警告时,我才会推荐此方法。