2016-08-25 19 views
1

は、私は、配列を持っているとしますnumpy 2d配列の列のランクを取得する方法は?

a = np.array([[1,2,3,4], 
       [4,2,5,6], 
       [6,5,0,3]]) 

私は(。すなわちnp.array([0, 1, 3]))各行の列0のランクを取得したい、これを行うための任意の短い方法はありますか?

1d配列では、これを行うにはnp.sum(a < a[0])を使用できますが、2次元配列はどうですか?しかし、<は放送できないようです。

+0

投稿されたソリューションはあなたのために機能しましたか? – Divakar

+0

@Divakarはい、ありがとう – maple

答えて

1

アプローチ#1

使用行に沿ってnp.argsortと私たちの入力配列と同じ形状のマスクを与えるために最初の列に対応するインデックス0探し。最後に、目的のランク出力のマスク内の一致の列インデックス(True)を取得します。だから、実装は次のようになり -

np.where(a.argsort(1)==0)[1] 

アプローチ#2

一度にすべての列のランクを取得する別の方法として、以前の方法をわずかに変更になります。実装は次のようになります -

(a.argsort(1)).argsort(1) 

をだから、最初の列のランクを取得するには、それの最初の列のインデックス、そうのような -

(a.argsort(1)).argsort(1)[:,0] 

サンプル実行

In [27]: a 
Out[27]: 
array([[1, 2, 3, 4], 
     [4, 2, 5, 6], 
     [6, 5, 0, 3]]) 

In [28]: np.where(a.argsort(1)==0)[1] 
Out[28]: array([0, 1, 3]) 

In [29]: (a.argsort(1)).argsort(1) # Ranks for all cols 
Out[29]: 
array([[0, 1, 2, 3], 
     [1, 0, 2, 3], 
     [3, 2, 0, 1]]) 

In [30]: (a.argsort(1)).argsort(1)[:,0] # Rank for first col 
Out[30]: array([0, 1, 3]) 

In [31]: (a.argsort(1)).argsort(1)[:,1] # Rank for second col 
Out[31]: array([1, 0, 2]) 
関連する問題