numpy中的“ isnotnan”功能,是否可以使用pythonic?


69

我需要一个从数组返回非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

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

Answers:



49

您目前正在测试非NaN的任何东西,而mtrw具有正确的方法来执行此操作。如果您有兴趣测试有限数(不是NaN也不是INF),则不需要反转,可以使用:

np.isfinite(a)

更多的pythonic和本机语言,易于阅读,在我的经验中,经常当你想避免使用NaN时,你也想避免使用INF。

只是以为我会把那个扔给别人。


3
注意:如果要使用isnotnan过滤熊猫,这是一种方法。
查理·海利

1
@EzekielKruglick,如果数据已经存在于熊猫中,不仅熊猫实际上更快,而且还具有更多功能,因为它包含一个索引,您可以使用它更轻松地加入:gist.github.com/jaypeedevlin/fdfb88f6fd1031a819f1d46cb36384da
Josh D.18年

1
我认为请留在评论中-最初的问题与熊猫无关。
乔什·D

1
@JoshD。那是不对的,Numpy更快。我评论了您的要旨gist.github.com/jaypeedevlin/…。基本上,您做错了-您是在Pandas对象上执行操作,而不是在ndarray上执行操作。在ndarray上执行操作的速度大约快25倍。
菲利普·卡恩

2
@philipKahn嗯,看来我确实出错了。我在想numpy在执行操作之前会强制转换为ndarray,所以这.values是不必要的-生活和学习!
Josh D.

3

我不确定这是多还是少的pythonic ...

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

它不适用于numpy数组。现在,您不仅可以获取列表(从而从根本上改变返回对象的性质),而且还可以在Python循环中运行,并且比numpy方法要慢几个数量级。我完全不推荐这样做
roganjosh

0

要获取array([ 1., 2.])数组,arr = np.array([np.nan, 1, 2]) 您可以执行以下操作:

 arr[~np.isnan(arr)]

要么

arr[arr == arr] 

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.