2017-02-27 23 views
0

我剛剛升級到巨蟒的新版本,其中Numpy:如何計算沒有警告的日誌?

%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

看看這個文檔:https://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html –

+0

「大多數情節總是以0開始。」那麼這個肯定不應該...... – shx2

回答

1

對數沒有在0中定義,所以您不可能在零點繪製該函數的圖形。一種選擇我看到的是,代替繪圖日誌(X)您繪製一個稍微複雜功能:

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

當然,你可以選擇X = 0不同的值,但我認爲0有道理。

使用參數linspace可以排除最後一點(通過使用x = linspace(0, 10, endpoint=False)),但我認爲沒有辦法排除起點。

0

Numpy提供了一個很好的機制來抑制使用errstate的警告,該警告僅在與with一起使用時才適用於本地。

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

但是,只有當您無法「手動」修改代碼以避免警告時,我纔會推薦此方法。