【问题标题】:"isnotnan" functionality in numpy, can this be more pythonic?numpy中的“isnotnan”功能,这可以更pythonic吗?
【发布时间】:2011-02-19 08:45:39
【问题描述】:

我需要一个从数组中返回非 NaN 值的函数。目前我正在这样做:

>>> a = np.array([np.nan, 1, 2])
>>> a
array([ NaN,   1.,   2.])

>>> np.invert(np.isnan(a))
array([False,  True,  True], dtype=bool)

>>> a[np.invert(np.isnan(a))]
array([ 1.,  2.])

Python:2.6.4 numpy:1.3.0

如果您知道更好的方法,请分享, 谢谢

【问题讨论】:

    标签: arrays numpy python nan


    【解决方案1】:
    a = a[~np.isnan(a)]
    

    【讨论】:

      【解决方案2】:

      您当前正在测试任何不是 NaN 的东西,而 mtrw 有正确的方法来执行此操作。如果您有兴趣测试有限数(不是 NaN 也不是 INF),那么您不需要求逆并且可以使用:

      np.isfinite(a)
      

      更多pythonic和原生,易于阅读,根据我的经验,通常当你想避免 NaN 时,你也想避免 INF。

      只是想我会把它扔给人们。

      【讨论】:

      • 注意:如果你想使用 isnotnan 来过滤 pandas,这是要走的路。
      • @EzekielKruglick 如果数据已经存在于 pandas 中,那么 pandas 不仅速度更快,而且功能也更强,因为它包含一个索引,您可以使用它来更轻松地加入:@987654321 @
      • 我认为把它留在 cmets - 最初的问题与熊猫无关。
      • @JoshD。这是不正确的,Numpy 更快。我评论了你的要点:gist.github.com/jaypeedevlin/…。基本上,你做错了——你是在 Pandas 对象上执行操作,而不是在 ndarray 上执行操作。在 ndarray 上执行操作大约快 25 倍。
      • @philipKahn 嗯,看起来我确实犯了一个错误。我在想象 numpy 在执行操作之前会强制转换为 ndarray,因此 .values 是不必要的 - 生活和学习!
      【解决方案3】:

      我不确定这或多或少是pythonic...

      a = [i for i in a if i is not np.nan]
      

      【讨论】:

      • 它不适合 numpy 数组。您现在不仅得到了一个 list (从而从根本上改变了返回对象的性质),而且它在 Python 循环中运行,并且比 numpy 方法慢几个数量级。我完全不推荐这个
      【解决方案4】:

      从数组arr = np.array([np.nan, 1, 2]) 中获取array([ 1., 2.]) 你可以这样做:

       arr[~np.isnan(arr)]
      

      arr[arr == arr] 
      

      (虽然:np.nan == np.nanFalse

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        • 2013-12-22
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-09
        • 1970-01-01
        相关资源
        最近更新 更多