我想实现
我希望在包含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.nan
是False
...:/
我曾考虑过将np.allclose
作为equal_nan
选项使用。但是重新实现唯一性不会有效
注意::我想大规模使用它。所以应该很快。
是否存在任何功能?我要编码吗?任何建议都会有所帮助。
答案 0 :(得分:1)
用肯定不在数据中的任何值替换nan
,np.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]])