2017-02-15 68 views
0

比方說,我有np.vectorize and nan - 我該如何讓他們玩得好?

>>> import numpy as np 
>>> nv = np.array([-1, np.nan, 1]) 

np.sin將如預期

>>> np.sin(nv) 
array([-0.84147098,   nan, 0.84147098]) 

但是,如果我嘗試對我自己的函數矢量化,它會失敗

>>> def noneg(n): 
     if n < 0: 
      return 0 
     return n 
>>> noneg(nv) 
... 
ValueError: cannot convert float NaN to integer 

這是因爲noneg返回的initize值是整數零,然後我們得到nan這是一個浮點數。

到目前爲止,我已經找到了解決的辦法是:

>>> @np.vectorize 
    def noneg(n): 
     if not np.isnan(n) and n < 0: 
      return n.__class__(0) 
     return n 
>>> noneg(nv) 
array([ 0., nan, 1.]) 

但是這個長相醜陋,有沒有更好的辦法忽略的矢量化nan

+0

嵌套'np.where'怎麼辦? –

+0

指定「型」。沒有它,返回'dtype'由第一個值的試算確定。 http://stackoverflow.com/a/41795777/901925 – hpaulj

回答

0

嗯,你已經寫了答案?

def noneg(n): 
    if n < 0: 
     return n.__class__(0) 
    return n 
noneg(nv) 

這裏的問題是變量0與您的輸入類型無關,我認爲。

相關問題