How to sort a numpy array with key as isnan?

前端 未结 3 1696
遥遥无期
遥遥无期 2020-12-21 16:26

I have a numpy array like

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         


        
3条回答
  •  既然无缘
    2020-12-21 17:12

    Approach #1

    Here's a vectorized approach borrowing the concept of masking from this post -

    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 run -

    # 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)
    

    Approach #2

    With few more modifications, a simplified version with the idea from 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
    

提交回复
热议问题