使用NaN值反向排序Numpy数组

时间:2016-01-27 13:27:12

标签: python arrays numpy

我有一个NaN数组,其中包含>>> a array([ 1., -1., nan, 0., nan], dtype=float32) 个值:

>>> numpy.sort(a)
array([ -1.,   0.,   1.,  nan,  nan], dtype=float32)
>>> numpy.sort(a)[::-1]
array([ nan,  nan,   1.,   0.,  -1.], dtype=float32)

我可以按升序或'降序'排序:

NaN

但是,我想要的是降序,最后是>>> numpy.genuine_reverse_sort(a) array([ 1., 0., -1., nan, nan], dtype=float32) 值,如下所示:

 If ActiveCell = "OK" Then

如何实现这一目标?我怀疑没有特别的方法。

4 个答案:

答案 0 :(得分:5)

我认为你可能是对的 - 没有内置的特殊方法来做到这一点。但是你可以通过将你的NaN滚动到你想要的地方,按照以下两个步骤来完成它:

a = np.array([  1.,  -1.,   np.nan,  0.,  np.nan], dtype=np.float32)
sa = np.sort(a)[::-1]
np.roll(sa,-np.count_nonzero(np.isnan(a)))

array([  1.,   0.,  -1.,  nan,  nan], dtype=float32)

答案 1 :(得分:2)

您可以执行以下操作:

>>> np.concatenate((np.sort(a[~np.isnan(a)])[::-1], [np.nan] * np.isnan(a).sum()))
array([ 1.,   0.,   -1.,  nan,  nan])

使用此片段反向排序输入数组的数字条目,然后使用适当数量的nan值连接。

答案 2 :(得分:2)

您可以使用np.argpartition仅对non-NaNs进行排序,如此 -

a[np.argpartition(-a, np.arange((~np.isnan(a)).sum()) )]

示例运行 -

In [253]: a
Out[253]: array([  1.,  -1.,  nan,   0.,  nan,   2.,   4.,  -2., -10.,  nan])

In [254]: a[np.argpartition(-a, np.arange((~np.isnan(a)).sum()) )]
Out[254]: array([  4.,   2.,   1.,   0.,  -1.,  -2., -10.,  nan,  nan,  nan])

答案 3 :(得分:0)

两次否定这些值怎么样:

>>> a = np.array([2., -1., nan,  0., nan])
>>> np.sort(a)
array([ -1.,   0.,   2.,  nan,  nan])
>>> -np.sort(-a)
array([  2.,   0.,  -1.,  nan,  nan])