2017-11-06 10 views
1

numpy配列内の各要素の発生数の要素ごとのカウントを、どの軸に沿って得ることができますか? 「要素別」とは、配列の各値を、表示される回数に変換することを意味します。numpy配列の値の軸に沿った要素単位のカウント

シンプル2D入力:

[[1, 1, 1], 
[2, 2, 2], 
[3, 4, 5]] 

万一出力:

[[3, 3, 3], 
[3, 3, 3], 
[1, 1, 1]] 

溶液はまた、所与の軸に対して作業する必要があります。たとえば、私の入力配列aが形「」を持っているとしたら、solution(a)を実行すると、上記の形式の(4, 2, 3, 3)の解決策が吐き出されるはずです。各3x3「部分行列」には対応するそのサブマトリクスに関連する要素だけでなく、全体の配列全体ではなく、

もっと複雑な例:aの入力例をとり、skimage.util.shape.view_as_windows(a, (2, 2))と呼んだとします。これは私の形状(2, 2, 2, 2)の配列bを与える:

[[[[1 1] 
    [2 2]] 

    [[1 1] 
    [2 2]]] 


[[[2 2] 
    [3 4]] 

    [[2 2] 
    [4 5]]]] 

その後solution(b)は、出力すべきである:値1はbaで3回と4回発生していても、それだけで二回

ので
[[[[2 2] 
    [2 2]] 

    [[2 2] 
    [2 2]]] 


[[[2 2] 
    [1 1]] 

    [[2 2] 
    [1 1]]]] 

発生します各2x2ウィンドウ。

+0

について詳しく説明 - numpyのarray'の値の軸に沿って '要素単位数を?何を正確に数えていますか? – Divakar

+0

これまでに何を試しましたか? –

+0

@Divakar各要素の出現回数を数えたいと思います。質問を編集してより明確にします。 [質問](https://stackoverflow.com/questions/47109031/calculating-windowed-probabilities-in-numpy-scipy/47109217#47109217)に関連して、あなたは巧みに昨日答えました。 – CaptainStiggz

答えて

3

アプローチオフ開始

我々はそうのように、出現のカウントを取得し、また、所望の出力のためのタグでこれらのカウントに私たちにインデックスをさせる、以降0から各要素をタグ付けするためにnp.uniqueを使用することができます -

入力配列の正の整数番号について
In [43]: a 
Out[43]: 
array([[1, 1, 1], 
     [2, 2, 2], 
     [3, 4, 5]]) 

In [44]: _,ids,c = np.unique(a, return_counts=1, return_inverse=1) 

In [45]: c[ids].reshape(a.shape) 
Out[45]: 
array([[3, 3, 3], 
     [3, 3, 3], 
     [1, 1, 1]]) 

、我々はまた、使用することができますnp.bincount -

In [73]: c = np.bincount(a.ravel()) 

In [74]: c[a] 
Out[74]: 
array([[3, 3, 3], 
     [3, 3, 3], 
     [1, 1, 1]]) 

負の整数の場合は、最小値だけオフセットします。ジェネリックのn-暗く

に拡張

はのはこのためbincountを使用してみましょう -

In [107]: ar 
Out[107]: 
array([[[1, 1, 1], 
     [2, 2, 2], 
     [3, 4, 5]], 

     [[2, 3, 5], 
     [4, 3, 4], 
     [3, 1, 2]]]) 

In [104]: ar2D = ar.reshape(-1,ar.shape[-2]*ar.shape[-1]) 

# bincount2D_vectorized from https://stackoverflow.com/a/46256361/ @Divakar 
In [105]: c = bincount2D_vectorized(ar2D) 

In [106]: c[np.arange(ar2D.shape[0])[:,None], ar2D].reshape(ar.shape) 
Out[106]: 
array([[[3, 3, 3], 
     [3, 3, 3], 
     [1, 1, 1]], 

     [[2, 3, 1], 
     [2, 3, 2], 
     [3, 1, 2]]]) 
+0

恐ろしい!私はポストを編集して、一般的なn-dimsソリューションの例を挙げました。私はあなたの "ジェネリックn-dims"ソリューションで数分間遊んで、私の例にマッチするようにマッサージできるかどうかを見ていきます。 – CaptainStiggz

+1

@CaptainStiggzパフォーマンスのために、他のオプションと一緒に遊んで、その投稿でビンチンカウントをすることもできます - https://stackoverflow.com/a/46256361/ – Divakar

+0

これは素晴らしいです!あなたはnumpyの基礎のためのより良い直感を開発するための読書の推奨事項を作ることができますか?あなたがやっている形を変えている人の中には、私のような初心者には黒い魔法のような感じがします。より複雑なユースケースについては、ドキュメントは少し疎です。例えば、 'np.shape'の[the docs](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.shape.html)は負の軸をカバーしていませんar.shape [-2] * ar.shape [-1]) ' – CaptainStiggz

関連する問題