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步。