2017-08-11 11 views
0

これは部分的にはhereと回答しています。numpy runtimewarningを例外としてキャッチして抑制する

とにかく私は自分が望むものを達成しているとは確信していません。私は何をしているのかを簡単に説明します: ネストされた構造を持つjsonファイルの巨大なリストを通して、読んでください:

  • これらの値が最も低い値を抽出し、これらの値がリストである場合に平均化します。
  • これらの値をnumpy配列に集めます。
  • 私のnumpy配列をpickledファイルにダンプします。

すべてが非常にスムーズになりますが、私はいくつかの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が好きではありません。

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

このコードは、任意の実行時の警告を与えることはありません、私はあなたが必要なもののために、このコードを適応させることができますね。

+0

numpy.seterr(all = 'warn')によって、毎回警告するようにシステムに指示します。これは、あなたが望むものとまったく逆です。しかし、np.seterr(all = 'ignore')でも問題を取り除かないので、警告はnp.seterrによってキャッチされていないようです。 –

+0

[警告](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

警告モジュールは、何が必要確かです。もし私に言わないならば。

関連する問題