2017-08-11 70 views
0

我知道這已被部分回答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

+0

By numpy.seterr(all ='warn')你告訴系統每次都發出警告,這與你想要的完全相反。然而,警告似乎沒有被np.seterr捕獲,因爲即使'np.seterr(all ='ignore')'也沒有擺脫這個問題 –

+0

我很確定我應該使用[warning](https:// docs.python.org/2/library/warnings.html)模塊,但我仍然無法看到如何以及在哪裏解決它。 – sparaflAsh

回答

0

感謝JürgMerlin Spaak的評論,我找到了一個更好更簡單的解決方案。這顯然還好趕上我恢復到原始版本的功能外例外:

def ExtractValues(d): 
    for v in d.values(): 
     if isinstance(v, dict): 
      yield from ExtractValues(v) 
     else: 
      if isinstance(v,list): 
       v = np.mean(v) 
      yield v 

我給自己定的一切在主片的代碼的警告:

np.seterr(all='warn') 

然後抓住他們:

with warnings.catch_warnings(): 
        warnings.filterwarnings('error') 
        try: 
         raw_features = list(ExtractValues(data)) 
        except Warning as e: 
         print('Houston, we have a warning:', e) 
         print('The bad guy is: ' + current_file) 
         print('This sample will not be considered.') 
         pass 
        else: 
         #Whatever 

無論誰來這裏爲相同的例外值得一提。我成功捕獲了兩個警告,但print(e)只會告訴你「意思是空片」。我可以猜出爲什麼,但我太累了,無法進一步調查。

2

的警告模塊確實是你所需要的:

import warnings 
with warnings.catch_warnings(): 
    warnings.simplefilter("ignore") 
    np.mean([]) 

此代碼將不會給出任何警告的運行時,我想你可以適應您所需要的驗證碼。如果不告訴我。