2

数値の位置を変更せずに、numpy配列をランク付けしたいと思います。以下のnumpy関数を使用してそれを行うことができましたが、「NaN」値もランク付けされ続けます。それらを無視して、代わりに実数値をランク付けするにはどうすればよいですか。どんな助けでも大歓迎です!ありがとう!

これが私のコードです:

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を初めて使用するので、助けていただければ幸いです。

4

1 に答える 1

3

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]
于 2012-09-20T20:04:11.810 に答える