2016-03-24 22 views
1

私は2次元配列があり、元の2次元配列のに基づいて値のランキングを表す新しい2次元配列をどのように作成できるのだろうかと思います。新しいランク秩序配列[すべての値に基づいて、複数の番号の同じランクを持つ]作成するNumpy配列ランクすべての要素

anArray = [[ 18.5, 25.9, 7.4, 11.1, 11.1] 
      [ 33.3, 37. , 14.8, 22.2, 25.9] 
      [ 29.6, 29.6, 11.1, 14.8, 11.1] 
      [ 25.9, 25.9, 14.8, 14.8, 11.1] 
      [ 29.6, 25.9, 14.8, 11.1, 7.4]] 

:私は次の配列を使用したい

anOrder = [[ 6, 4, 9, 8, 8] 
      [ 2, 1, 7, 5, 4] 
      [ 3, 3, 8, 7, 8] 
      [ 4, 4, 7, 7, 8] 
      [ 3, 4, 7, 8, 9]] 

ありがとうございました。

答えて

2

そうのように、他の要素の中で一意性に基づいて、各要素をタグ付けし、そのオプションの引数return_inversenp.uniqueためのルーチンワークだ -

_,id = np.unique(anArray,return_inverse=True) 
out = (id.max() - id + 1).reshape(anArray.shape) 

サンプル実行 - あなたが使用することができます

In [17]: anArray 
Out[17]: 
array([[ 18.5, 25.9, 7.4, 11.1, 11.1], 
     [ 33.3, 37. , 14.8, 22.2, 25.9], 
     [ 29.6, 29.6, 11.1, 14.8, 11.1], 
     [ 25.9, 25.9, 14.8, 14.8, 11.1], 
     [ 29.6, 25.9, 14.8, 11.1, 7.4]]) 

In [18]: _,id = np.unique(anArray,return_inverse=True) 

In [19]: (id.max() - id + 1).reshape(anArray.shape) 
Out[19]: 
array([[6, 4, 9, 8, 8], 
     [2, 1, 7, 5, 4], 
     [3, 3, 8, 7, 8], 
     [4, 4, 7, 7, 8], 
     [3, 4, 7, 8, 9]]) 
3

scipy.stats.rankdatamethod='dense'の値はのようになりますので、rankdataで返された配列の形状を復元する必要があります。例えば

In [21]: anArray 
Out[21]: 
[[18.5, 25.9, 7.4, 11.1, 11.1], 
[33.3, 37.0, 14.8, 22.2, 25.9], 
[29.6, 29.6, 11.1, 14.8, 11.1], 
[25.9, 25.9, 14.8, 14.8, 11.1], 
[29.6, 25.9, 14.8, 11.1, 7.4]] 

In [22]: a = np.array(anArray) 

In [23]: r = rankdata(a, method='dense').reshape(a.shape) 

In [24]: ranks = (r.max()+1) - r 

In [25]: ranks 
Out[25]: 
array([[6, 4, 9, 8, 8], 
     [2, 1, 7, 5, 4], 
     [3, 3, 8, 7, 8], 
     [4, 4, 7, 7, 8], 
     [3, 4, 7, 8, 9]]) 

注0から始まるローからハイにrankdataランク、そのため、ランクrが反転し、ラインranks = (r.max()+1) - rと1で開始するように設定されています。

関連する問題