numpy中的“isnotnan”功能,这可以更pythonic吗?
Posted
技术标签:
【中文标题】numpy中的“isnotnan”功能,这可以更pythonic吗?【英文标题】:"isnotnan" functionality in numpy, can this be more 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
如果您知道更好的方法,请分享, 谢谢
【问题讨论】:
【参考方案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.nan 是 False)
【讨论】:
以上是关于numpy中的“isnotnan”功能,这可以更pythonic吗?的主要内容,如果未能解决你的问题,请参考以下文章