2016-01-27 16 views
8

Ho un allineamento numpy con alcune NaN valori:Reverse sorta di matrice Numpy con NaN valori

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

posso ordinare in ordine crescente o 'decrescente' ordine:

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

Tuttavia, ciò Voglio essere in ordine decrescente con valori NaN alla fine, in questo modo:

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

Come potrebbe essere realizzato? Sospetto che non ci sia un metodo speciale per questo.

+1

solo contare NaN, rimuoverli, ordinare, quindi concatenare NaN alla fine? – pavel

risposta

4

Penso che probabilmente hai ragione - non esiste un metodo speciale per farlo. Ma si potrebbe fare in due fasi come segue facendo rotolare i vostri NaNs nel luogo li volete:

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

È possibile effettuare le seguenti operazioni:

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

Con questo frammento si invertire ordinare le voci numeriche della matrice di input e quindi si concatena con il numero appropriato di valori nan.

2

È possibile utilizzare np.argpartition per ordinare solo la non-NaNs, in questo modo - corsa

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

Campione -

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

Che dire negare i valori due volte:

>>> 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]) 
Perché non
Problemi correlati