如何在numpy数组中找到唯一的非nan值?

时间:2015-03-09 11:03:02

标签: python numpy nan

我想知道是否有一种干净的方式来处理numpy中的nan。

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])
print my_array1
#[  5.   4.   2.   2.   4.  nan  nan   6.]
print set(my_array1)
#set([nan, nan, 2.0, 4.0, 5.0, 6.0])

我原本以为它应该返回最多1纳米的值。为什么它会返回多个nan值? 我想知道我在numpy数组中有多少独特的非纳米值。

由于

5 个答案:

答案 0 :(得分:17)

您可以使用np.uniqueisnan结合使用来查找唯一值,以过滤NaN值:

In [22]:

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])
np.unique(my_array1[~np.isnan(my_array1)])
Out[22]:
array([ 2.,  4.,  5.,  6.])

至于为什么您会获得多个NaN值因为NaN值无法正常比较:

In [23]:

np.nan == np.nan
Out[23]:
False

所以你必须使用isnan来执行正确的比较

使用set

In [24]:

set(my_array1[~np.isnan(my_array1)])
Out[24]:
{2.0, 4.0, 5.0, 6.0}

您可以通过以上任意一种方式致电len来获取尺寸:

In [26]:

len(np.unique(my_array1[~np.isnan(my_array1)]))
Out[26]:
4

答案 1 :(得分:6)

我建议使用熊猫。我认为这是直接的替代品,但与numpy不同,熊猫会保留原始顺序。

import numpy as np
import pandas as pd

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])

np.unique(my_array1)
# array([ 2.,  4.,  5.,  6., nan, nan])

pd.unique(my_array1)
# array([ 5.,  4.,  2., nan,  6.]) 

我正在使用numpy 1.17.4和pandas 0.25.3。希望这会有所帮助!

答案 2 :(得分:0)

您可以将isnan()与setm一起使用,然后遍历isnan()数组的结果并删除所有NaN对象。

my_array1=np.array([5,4,2,2,4,np.nan,np.nan,6])
print my_array1
#[  5.   4.   2.   2.   4.  nan  nan   6.]
print set(my_array1)
#set([nan, nan, 2.0, 4.0, 5.0, 6.0])
for i,is_nan in enumerate(np.isnan(list(my_array1))):
    if is_nan:
        del my_array1[i]

答案 3 :(得分:0)

如先前的回答所述,numpy无法直接计算nans,因为它无法比较nans。 numpy.ma.count_masked是您的朋友。例如,像这样:

>>> import numpy.ma as ma
>>> a = np.arange(5, dtype=float)
>>> a[2] = np.NaN
>>> a[3] = np.NaN
>>> a
array([ 0.,  1., nan, nan,  4.])
>>> a_masked = ma.masked_invalid(a)
>>> a_masked
masked_array(data=[0.0, 1.0, --, --, 4.0],
             mask=[False, False,  True,  True, False],
       fill_value=1e+20)
>>> ma.count_masked(a_masked)
2

答案 4 :(得分:0)

从 Numpy 1.21.0 版开始,np.unique now returns single NaN

>>> a = np.array([8, 1, np.nan, 3, np.inf, np.nan, -np.inf, -2, np.nan, 3])
>>> np.unique(a)
array([-inf,  -2.,   1.,   3.,   8.,  inf,  nan])