我刚刚升级到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)
这样的东西对我来说非常难看。
答案 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')
但是,只有当您无法“手动”修改代码以避免警告时,我才会推荐此方法。