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

use*_*487 10 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])
Run Code Online (Sandbox Code Playgroud)

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

谢谢

EdC*_*ica 19

您可以结合使用np.unique来查找唯一值isnan以过滤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.])
Run Code Online (Sandbox Code Playgroud)

至于为什么你得到多个NaN值,因为NaN无法正常比较值:

In [23]:

np.nan == np.nan
Out[23]:
False
Run Code Online (Sandbox Code Playgroud)

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

使用set:

In [24]:

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

您可以len通过以上任何一种方式调用以获得尺寸:

In [26]:

len(np.unique(my_array1[~np.isnan(my_array1)]))
Out[26]:
4
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 6

我建议使用熊猫。我认为这是直接替换,但与 numpy 不同,pandas 保留了原始顺序。

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.]) 
Run Code Online (Sandbox Code Playgroud)

我正在使用 numpy 1.17.4 和 Pandas 0.25.3。希望这可以帮助!