2017-08-29 12 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比較?不同的值可能不一定是相同的實例。對於整數和浮點數都是如此。 (CPython的的怪癖的小整數是我知道的唯一的例外,是嚴格意義上的實現細節。)

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

您可以使用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'只會被實例化一次,而'is'是檢查它的正確方法。感謝您的提示,它解決了我的問題。 –