代码之家  ›  专栏  ›  技术社区  ›  Venkatachalam

如何检查列表中是否存在NP.NAN和/或无。

  •  2
  • Venkatachalam  · 技术社区  · 7 年前

    None 被认为是错误的条件。但是 np.NaN 被认为是 True 当转换为 bool .

    any([np.nan, np.NaN, None])
    #True
    

    我知道,用 np.isnan() . 如果我的数据结合了 NP.N. , 没有 , np.nan 如果有,我怎么能找到它?

    有没有更简单的方法可以找到它们中的任何一个?

    编辑:

    预期输出:

    func([np.nan, np.NaN, None, 2])
    #True
    func([np.nan, np.NaN, None,''])
    #False
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Scott Boston    7 年前

    还有一个诀窍:

    arr = [np.nan, None, np.nan]
    
    [i == i if i is not None else False  for i in arr]
    

    输出:

    [False, False, False]
    

    注: np.nan == np.nan 返回错误

    因此,

    arr = [np.nan, None, np.nan, '']
    any([i == i if i is not None and i != '' else False  for i in arr])
    

    输出:

    False
    

    而且,

    arr = [np.nan, None, np.nan, 2]
    
    any([i == i if i is not None and i != '' else False  for i in arr])
    

    输出:

    True
    

    计时:

    %timeit any([np.nan_to_num(x) for x in arr])
    

    每个回路241_±22____礹s(平均_±标准偏差为7次,每个回路1000次)

    %timeit any([isvalid(x) for x in arr])
    

    每个回路20.5_?.95_?s(平均_?标准偏差为7次,每个回路100000次)

    %timeit any([i == i if i is not None and i != '' else False  for i in arr])
    

    每个回路2.44μs_±137 ns(平均_±标准偏差7次,每个回路100000次)

        2
  •  3
  •   Cory Nezin    7 年前

    您可以定义自己的自定义函数来检查数字是否在有效的输入集中,例如:

    def isvalid(number):
        if number is None or np.isnan(number):
            return False
        else:
            return True
    
    any([isvalid(x) for x in data])
    

    编辑:我知道你可能想检查它们中的任何一个是否有效,你可以简单地否定isvalid结果来实现这一点。

        3
  •  2
  •   EdChum Arthur G    7 年前

    另一种方法是将任何NaN转换为有效数字,在这种情况下 0.0 :

    In[91]:
    any([np.nan_to_num(x) for x in [np.nan, np.NaN, None]])
    
    Out[91]: False
    

    np.nan_to_num 将转换 NaN :

    In[92]:
    
    [np.nan_to_num(x) for x in [np.nan, np.NaN, None]]
    Out[92]: [0.0, 0.0, None]
    

    编辑

    这还将处理您更新的示例数据:

    In[93]:
    
    any([np.nan_to_num(x) for x in [np.nan, np.NaN, None,'']])
    Out[93]: False