2017-05-09 21 views
2

私は次の形式の2次元配列を持っています:np.zeros((m,n))。 私の目的は、最初の2列を見て、最初の列の要素が最も発生している(最初の列のモード)ので、2番目の列同じです。配列内の条件付き出現回数をカウントする

5×3例:

[[1 2 x], [1 2 y], [1 3 z], [5 3 w], [5 6 v], [9 2 x], [9 2 y],] 

所望の出力の発生回数、すなわち:それはカウンタ機能である方法でそう

[1]: 2 
[5]: 2 
[9]: 1 

が、二番目の配列(列2)を条件。

私は比較的新しいPythonですが、これを直接的かつ多少効率的に実行できる機能はありますか?私は非常に大きな行列でそれを実行する必要がありますが、そのような関数を見つけることができませんでした。

+0

は、だから、最初の2つの列で検索し、それらだけをカウントしますそれらが一意ならば。私の頭の上から外してください:最初の列で配列を並べ替えてから、1番目と2番目の項目が前の項目と同じかどうかを調べることができます。見つけた数 –

+0

問題は、最初の列をソートし、最初の列の同じ値に対応する2番目の列のセグメントをソートし、最後に2番目の列に繰り返しループする必要があることです。 –

+0

はい、間違いです。最初の2つの列を1つの列で並べ替えることができると思います。あなたは '[1 2 x]'を '12'として扱わなければならないので、 '[1 0 z]'の後に来るようになります。その後、あなたは数えます。 –

答えて

2

この機能は問題を解決します。あなたの入力のために、返し、

def count_special(arr): 
    counter = {} 
    for i in np.unique(arr[:,0]): 
     sec = arr[arr[:,0]==i,1] 
     counter[i] = len(np.unique(sec)) 
    return counter 

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

- > {1:2、5:2}

関連する問題