2017-08-29 2 views
0

私は整数の組またはnp.nanを返すことになっている関数を持っています。リストの理解の中でnp.nanをチェックする方法は?

return tuple(int(round(n)) if n is not np.nan else n for n in r) 

コードは私にはうまく見えますが、次のエラーが表示され、何が間違っているかわかりません。

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-7-368ab2ecd3f3> in <module>() 
     6 warnings.filterwarnings("ignore") #ignore numpy warnings 
     7 for k,v in bb_mapping.items(): 
----> 8  print(k, map_overview(v)) 

<ipython-input-2-6f1dc6e291ee> in map_overview(map_tuples) 
    120 
    121  r = (np.mean(bb_len), np.std(bb_len), np.mean(ins_len), np.std(ins_len)) 
--> 122  return tuple(int(round(n)) if n is not np.nan else n for n in r) 
    123 
    124 def print_sbar(n,m,s='|#.|',size=30,message=''): 

<ipython-input-2-6f1dc6e291ee> in <genexpr>(.0) 
    120 
    121  r = (np.mean(bb_len), np.std(bb_len), np.mean(ins_len), np.std(ins_len)) 
--> 122  return tuple(int(round(n)) if n is not np.nan else n for n in r) 
    123 
    124 def print_sbar(n,m,s='|#.|',size=30,message=''): 

ValueError: cannot convert float NaN to integer 

整数に変換する前にnp.nanの値を明示的にチェックしていると、このエラーが発生することはありますか?

私は手動でのリターンコードをチェックすると、リストの内包が期待通りに動作しますが、十分な奇妙な:

​​

は、私がここで何をしないのですか?

答えて

1

なぜあなたはisと比べていますか?異なる値が必ずしも同じインスタンスであるとは限りません。これはintsとfloatに当てはまります。 (小さな整数のCPythonの者の癖は、私が知っている唯一の例外であり、厳密に実装の詳細である。)

>>> import math 
>>> float('nan') is math.nan 
False 

あなたがNaNかどうかを確認するためにnp.isnanを使用し、または内蔵math.isnan、またはことを確認することができます値はそれ自体に等しい。

>>> np.isnan([12.6,np.nan,0.5,4.6]) 
array([False, True, False, False], dtype=bool) 
>>> [math.isnan(x) for x in [12.6,np.nan,0.5,4.6]] 
[False, True, False, False] 
>>> [x for x in [12.6,np.nan,0.5,4.6] if x == x] 
[12.6, 0.5, 4.6] 
+0

私は 'np.nan'が一度だけインスタンス化されることを確信していました。それは正しい方法です。先端のおかげで、それは私の問題を解決しました。 –

関連する問題