2012-09-20 86 views
0

我想排列一個numpy數組而不會改變數字位置。 我能夠使用下面的numpy函數來做到這一點,但它也保持對'NaN'值的排名,我怎樣才能讓它忽略它們,而只是將實數值排序。任何幫助深表感謝! 謝謝!在python中排列數組,同時忽略缺失值

這是我的代碼:

import numpy as np 

hr=[] 
for line in open('file.txt' ,'r'): 
    hr.append(line.strip().split('\t')) 

tf=[] 
for i in range(1,len(hr)): 
    print hr[i][1:13] 
    tf.append(hr[i][1:13]) 

for rows in range(0,len(tf)): 
    array = np.array([tf[rows]],dtype(float)) 
    print array 
    order = array.argsort() 
    ranks = order.argsort() 
    print ranks  

在這裏,每個陣列線是這樣的,從TF:

array=['NaN', '20', '383.333', 'NaN', 'NaN', 'NaN', '5', '100', '129', '122.5', 'NaN', 'NaN']

希望的輸出:

ranks=array['NaN', 1, 5, 'NaN', 'NaN', 'NaN', 0, 2, 4, 3, 'NaN', 'NaN']

實際用上面的代碼輸出:

ranks=array([ 6, 3, 4, 7, 8, 9, 5, 0, 2, 1, 10, 11])

我是新來的Python所以任何幫助表示讚賞!

回答

2

如果你有SciPy的,mstats.rankdata基本上你想要做什麼:

import scipy.stats.mstats as mstats 
import numpy as np 

array = np.array(map(float, ['NaN', '20', '383.333', 'NaN', 'NaN', 'NaN', '5', '100', '129', '122.5', 'NaN', 'NaN'])) 

np.ma.masked_invalid口罩nan值。 mstats.rankdata對非掩碼值進行排序,並將掩碼值分配爲0。

ranks = mstats.rankdata(np.ma.masked_invalid(array)) 
print(ranks) 
# [ 0. 2. 6. 0. 0. 0. 1. 3. 5. 4. 0. 0.] 

現在我們只雲杉它一點得到所需的輸出:

ranks[ranks == 0] = np.nan 
ranks -= 1 
print(ranks) 
# [ nan 1. 5. nan nan nan 0. 2. 4. 3. nan nan] 
+0

+1的正確使用蒙面陣列... –