gpt4 book ai didi

python - 如何使用 isnan 键对 numpy 数组进行排序?

转载 作者:太空宇宙 更新时间:2023-11-03 13:09:44 24 4
gpt4 key购买 nike

我有一个像

这样的 numpy 数组
np.array([[1.0, np.nan, 5.0, 1, True, True, np.nan, True],
[np.nan, 4.0, 7.0, 2, True, np.nan, False, True],
[2.0, 5.0, np.nan, 3, False, False, True, np.nan]], dtype=object)

现在我想用 isnan 键对值进行排序?我怎样才能做到这一点?这样我就会在数组中结束

np.array([[1.0, 5.0, 1, True, True, True, np.nan, np.nan],
[4.0, 7.0, 2, True, False, True, np.nan, np.nan],
[2.0, 5.0, 3, False, False, True, np.nan, np.nan]], dtype=object)

np.sort() 无效。在 pandas 中,可以通过使用带有键为 pd.isnull() 的 sorted 函数对列进行排序来实现相同的目的,但要寻找速度的 numpy 答案。

在 Pandas 中

data = pd.DataFrame({'Key': [1, 2, 3], 'Var': [True, True, False], 'ID_1':[1, np.NaN, 2],
'Var_1': [True, np.NaN, False], 'ID_2': [np.NaN, 4, 5], 'Var_2': [np.NaN, False, True],
'ID_3': [5, 7, np.NaN], 'Var_3': [True, True, np.NaN]})

data.apply(lambda x : sorted(x,key=pd.isnull),1).values

输出:

array([[1.0, 5.0, 1, True, True, True, nan, nan],
[4.0, 7.0, 2, True, False, True, nan, nan],
[2.0, 5.0, 3, False, False, True, nan, nan]], dtype=object)

最佳答案

方法 #1

这是一种矢量化方法,它借鉴了 this post 中的 masking 概念。 -

def mask_app(a):
out = np.empty_like(a)
mask = np.isnan(a.astype(float))
mask_sorted = np.sort(mask,1)
out[mask_sorted] = a[mask]
out[~mask_sorted] = a[~mask]
return out

sample 运行-

# Input dataframe
In [114]: data
Out[114]:
ID_1 ID_2 ID_3 Key Var Var_1 Var_2 Var_3
0 1.0 NaN 5.0 1 True True NaN True
1 NaN 4.0 7.0 2 True NaN False True
2 2.0 5.0 NaN 3 False False True NaN

# Use pandas approach for verification
In [115]: data.apply(lambda x : sorted(x,key=pd.isnull),1).values
Out[115]:
array([[1.0, 5.0, 1, True, True, True, nan, nan],
[4.0, 7.0, 2, True, False, True, nan, nan],
[2.0, 5.0, 3, False, False, True, nan, nan]], dtype=object)

# Use proposed approach and verify
In [116]: mask_app(data.values)
Out[116]:
array([[1.0, 5.0, 1, True, True, True, nan, nan],
[4.0, 7.0, 2, True, False, True, nan, nan],
[2.0, 5.0, 3, False, False, True, nan, nan]], dtype=object)

方法 #2

再做一些修改,一个简化版的想法来自this post -

def mask_app2(a):
out = np.full(a.shape,np.nan,dtype=a.dtype)
mask = ~np.isnan(a.astype(float))
out[np.sort(mask,1)[:,::-1]] = a[mask]
return out

关于python - 如何使用 isnan 键对 numpy 数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com