我知道這已被部分回答here。捕捉numpy運行時警告作爲例外,並抑制它們
無論如何,我不知道我達到了我想要的。我會簡單介紹一下我在做什麼:
- 通過一個巨大的具有特別 嵌套結構JSON文件列表讀取。
- 從中提取最低級別的值,並在這些值爲列表時進行平均。
- 將這些值收集到numpy數組中。
- 將我的numpy數組轉換爲pickle文件。
一切進展相當順利,但我收到一些numpy的運行時警告:
RuntimeWarning: Mean of empty slice.
RuntimeWarning: invalid value encountered in double_scalars
功能,給了我麻煩的是一個究竟是誰提取其數值執行此操作:v = np.mean(v)
我知道這個錯誤可能是由一個零列表或一些NaN/Inf或任何值到該值引起的。
我想擺脫他們只是從我的數據集扔掉當前的.json示例。
所以我設置:np.seterr(all='warn')
而且我做了這個尷尬的代碼,試圖抓住它:
def ExtracValues(d):
for v in d.values():
if isinstance(v, dict):
yield from ExtracValues(v)
else:
if isinstance(v,list):
# v = np.mean(v) #just averaging vectorial values of features. #it may be here that raises the empty slice warning of numpy.
try:
v = np.mean(v)
except Warning:
return #trying to trash samples which are no behaving good
yield v
我的問題是,我不知道它是否有效地工作,因爲警告仍然打印在stdout上。我想代碼應該在設置all="Warning"
後停止,但我怎麼能輕鬆檢查我是否正確?
此外,是否有一個更pythonic的方式來縮短該功能。我真的不喜歡這樣嵌套的try/except
。
By numpy.seterr(all ='warn')你告訴系統每次都發出警告,這與你想要的完全相反。然而,警告似乎沒有被np.seterr捕獲,因爲即使'np.seterr(all ='ignore')'也沒有擺脫這個問題 –
我很確定我應該使用[warning](https:// docs.python.org/2/library/warnings.html)模塊,但我仍然無法看到如何以及在哪裏解決它。 – sparaflAsh