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.nanFalse

【讨论】:

以上是关于numpy中的“isnotnan”功能,这可以更pythonic吗?的主要内容,如果未能解决你的问题,请参考以下文章

用 NumPy 中的视图来节省内存

使用条件更改 numpy 数组中的每个值

Python中的Numpy包

为啥 NumPy 和 SciPy 有很多相同的功能?我应该更喜欢哪个? [复制]

如何在Python中使用numpy获取累积最大索引?

登高自卑 | 我的NumPy笔记