2016-01-27 23 views
8

Ben numpy bazı NaN değerlerle dizi var değerleri:Ters sıralama

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

Ben artan bunu sıralayabilir veya sipariş 'azalan':

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

Ancak, ne böyle, sonunda NaN değerlerle azalan olduğu istiyorum:

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

Bu nasıl başarılabilir? Bunun için özel bir yöntem olmadığını sanıyorum.

+1

Neden olmasın NaN'ları sayın, onları kaldırın, sıralayın ve sonra NaN'ları birleştirin mi? – pavel

cevap

4

Sanırım muhtemelen haklısınız - bunu yapmak için özel bir yöntem yok. yerine sizin NaN'ler yuvarlayarak şöyle Ama iki adımda yapabileceğini bunları istiyorum:

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

Aşağıdaki yapabilirsiniz: Bu parçayla

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

sıralama sayısal girişleri ters giriş dizisinin ve sonra uygun sayıda nan değerleri ile birleştirme.

2

Çok gibi sadece non-NaNs sıralamak için np.argpartition kullanabilirsiniz -

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

Numune run -

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

Ne iki kez değerlerini inkâr hakkında: sadece

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