Python 使用NaN值对Numpy数组进行反向排序

Python 使用NaN值对Numpy数组进行反向排序,python,arrays,numpy,Python,Arrays,Numpy,我有一个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.,

我有一个
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)

如何做到这一点?我怀疑没有专门的方法来做这件事。

我想你可能是对的——没有内置的专门方法来做这件事。但是,您可以通过以下两个步骤来完成此操作:将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)

您可以执行以下操作:

>>> np.concatenate((np.sort(a[~np.isnan(a)])[::-1], [np.nan] * np.isnan(a).sum()))
array([ 1.,   0.,   -1.,  nan,  nan])
使用此片段,您可以对输入数组的数字项进行反向排序,然后将适当数量的
nan
值连接在一起。

您可以仅对
非nan
进行排序,如下所示-

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

两次求反怎么样:

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

为什么不数一数NaN,删除它们,排序,然后在最后连接NaN?谢谢!这对于多维数组和在单轴上排序时非常有用。我不确定这里提到的其他方法是否有效。我正在考虑将
nan
s替换为
-1
,排序并将
-1
替换为
nan
s。(数组中的所有元素都是非负的)。但是你的更好。一步解决,而不是3步。