与南人成为独特的情侣

时间:2018-08-16 11:59:01

标签: python numpy unique nan

我想实现

我希望在包含nan的2d numpy数组中获得唯一的行。

更一般而言,我想根据n-d numpy.ndarray中的轴获取唯一值。

可复制的示例

import numpy as np
example = np.array([[0, np.nan], 
                    [np.nan, 1], 
                    [0, np.nan], 
                    [np.nan, np.nan], 
                    [np.nan, 1], 
                    [np.nan, np.nan]])

我希望得到的结果:

array([[ 0., nan],
       [nan,  1.],
       [nan, nan]])

我尝试过的

我尝试使用np.unique,但无法使用:

np.unique(example, axis=0)

结果是:

array([[ 0., nan],
       [ 0., nan],
       [nan,  1.],
       [nan,  1.],
       [nan, nan],
       [nan, nan]])

所以我发现np.nan == np.nanFalse ...:/

我曾考虑过将np.allclose作为equal_nan选项使用。但是重新实现唯一性不会有效

注意::我想大规模使用它。所以应该很快。

是否存在任何功能?我要编码吗?任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:1)

用肯定不在数据中的任何值替换nannp.unique就可以了:

import numpy as np
example = np.array([[0, np.nan], 
                    [np.nan, 1], 
                    [0, np.nan], 
                    [np.nan, np.nan], 
                    [np.nan, 1], 
                    [np.nan, np.nan]])

# substitute nan with inf
example[np.isnan(example)] = np.inf

u = np.unique(example, axis=0)

# substitute inf with nan
u[u == np.inf] = np.nan

print(u)
# [[  0.  nan]
#  [ nan   1.]
#  [ nan  nan]]

在示例中,我使用了inf,但其他任何值都可以。只要确保它不会出现在数据中即可。

答案 1 :(得分:1)

您可以为此使用pandas.DataFrame。熊猫建立在numpy二维数组的基础上,如果您获得了DataFrame的values属性,则可以得到裸露的数组。 要仅保留唯一行,请使用drop_duplicates

import pandas as pd

pd.DataFrame(example).drop_duplicates().values
# Out: 
array([[ 0., nan],
       [nan,  1.],
       [nan, nan]])