在python中将“nan”移到数组的开头[重复]

Posted

技术标签:

【中文标题】在python中将“nan”移到数组的开头[重复]【英文标题】:Shift "nan" to the beginning of an array in python [duplicate] 【发布时间】:2020-11-11 19:51:12 【问题描述】:

如果我有一个带有 nan 的数组,它看起来像这样:

array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0., nan, nan],
       [ 0.,  1.,  3., nan],
       [ 0.,  2.,  4.,  7.],
       [ 0., nan,  2., nan],
       [ 0.,  4., nan, nan]])

如何在不改变形状的情况下将所有 nan 移到数组的开头? 像这样的东西:

array([[ 0.,  0.,  0.,  0.],
       [ nan, nan, 0.,  0.],
       [ nan, 0.,  1.,  3.],
       [ 0.,  2.,  4.,  7.],
       [ nan, nan, 0.,  2.],
       [ nan, nan, 0.,  4.]])

【问题讨论】:

很酷的问题。编写解决方案并不难,但我期待利用 numpy 获得高性能答案。 【参考方案1】:

这是一种方法:

# find the position of nan itms in "a"
In [19]: mask = np.isnan(a)                                                                                                                                                                                 
# put them at the beginning by sorting the mask in a descending order
In [20]: nan_pos = np.sort(mask)[:,::-1]                                                                                                                                                                    
# the new position of non_non items is the inverse of non-mask sorted ascending 
In [21]: not_nan_pos = np.sort(~mask)                                                                                                                                                                       

In [22]: emp = np.empty(a.shape)                                                                                                                                                                            

In [23]: emp[nan_pos] = np.nan                                                                                                                                                                              

In [24]: emp[not_nan_pos] = a[~mask]                                                                                                                                                                        

In [25]: emp                                                                                                                                                                                                
Out[25]: 
array([[ 0.,  0.,  0.,  0.],
       [nan, nan,  0.,  0.],
       [nan,  0.,  1.,  3.],
       [ 0.,  2.,  4.,  7.],
       [nan, nan,  0.,  2.],
       [nan, nan,  0.,  4.]])

【讨论】:

以上是关于在python中将“nan”移到数组的开头[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python\Numpy:将数组与 NAN 进行比较 [重复]

在 numpy 数组求和中将 nan 视为零,但所有数组中的 nan 除外

Python:替换数组中的 NaN 或 MEAN 而不是 -999 值[重复]

JavaScript中将字符串类型转换为整形的函数

如何在 Matlab 中将字符串单元格数组转换为 int 和 NaN?

在python中将所有零移动到数组的末尾