2016-09-01 5 views
1

私はPython Numpyで繰り返し数の長さを取得しようとしています。たとえば、最初の列が[0, 1, 0, 1]を持って、1の位置が今そこからカウントを開始し、1あるのは、単純なndarray繰り返し数の列の長さを取得するにはどうすればよいですか?

import numpy as np 

a = np.array([ 
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [1, 0, 1, 0, 0, 1, 1, 1, 0, 1], 
    [0, 1, 0, 1, 0, 1, 0, 0, 1, 0], 
    [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
]) 

を考えてみましょう、我々はones = 2zeros = 1を取得します。だから、1に遭遇したとき(開始位置)、oneszerosを数え始めなければならない。

いずれかが私を助けてくださいすることができそうaのための答えは

ones = [2, 2, 1, 1, 1, 3, 2, 2, 1, 1] 
zeros = [1, 0, 2, 1, 0, 0, 1, 1, 1, 2] 

でしょうか?

更新

3D配列:

a = np.array([ 
    [ 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], 
     [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], 
     [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
    ], 
    [ 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 1, 0, 0, 0, 1, 1], 
     [0, 1, 0, 1, 0, 0, 0, 1, 0, 0], 
     [1, 1, 0, 1, 0, 1, 1, 1, 0, 0], 
    ] 
]) 

期待される出力は、パフォーマンスを中心に

ones = [ 
     [2, 3, 0, 0, 1, 3, 2, 2, 1, 0], 
     [1, 3, 0, 2, 1, 1, 1, 2, 1, 1] 
     ] 
zeros = [ 
      [1, 0, 0, 0, 0, 0, 1, 1, 1, 0], 
      [0, 0, 0, 0, 2, 0, 0, 0, 2, 2] 
     ] 
+0

'a'で常に0と1になるのでしょうか、それとも他の数字もありますか? – Divakar

+0

@Divakar常に0または1 – Akshay

答えて

4

する必要があり、ここでndarraysのための1つの一般的なアプローチだ -

ones_count = a.sum(-2) 
zeros_count = (a.shape[-2] - ones_count - a.argmax(-2))*a.any(-2) 
を使用して、選択し zeros_countを取得する

1つの代替、だろう -

zeros_count = np.where(a.any(-2),a.shape[-2] - ones_count - a.argmax(-2),0) 

サンプル

2D場合に実行されます。

In [60]: a 
Out[60]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 0, 1, 0, 0, 1, 1, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1, 0, 0, 1, 0], 
     [1, 1, 0, 0, 1, 1, 1, 1, 0, 0]]) 

In [61]: ones_count = a.sum(-2) 
    ...: zeros_count = (a.shape[-2] - ones_count - a.argmax(-2))*a.any(-2) 
    ...: 

In [62]: ones_count 
Out[62]: array([2, 2, 1, 1, 1, 3, 2, 2, 1, 1]) 

In [63]: zeros_count 
Out[63]: array([1, 0, 2, 1, 0, 0, 1, 1, 1, 2]) 

3Dの場合:

In [65]: a = np.array([ 
    ...:  [ 
    ...:   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    ...:   [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], 
    ...:   [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], 
    ...:   [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
    ...:  ], 
    ...:  [ 
    ...:   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    ...:   [0, 1, 0, 0, 1, 0, 0, 0, 1, 1], 
    ...:   [0, 1, 0, 1, 0, 0, 0, 1, 0, 0], 
    ...:   [1, 1, 0, 1, 0, 1, 1, 1, 0, 0], 
    ...:  ] 
    ...: ]) 

In [66]: ones_count = a.sum(-2) 
    ...: zeros_count = (a.shape[-2] - ones_count - a.argmax(-2))*a.any(-2) 
    ...: 

In [67]: ones_count 
Out[67]: 
array([[2, 3, 0, 0, 1, 3, 2, 2, 1, 0], 
     [1, 3, 0, 2, 1, 1, 1, 2, 1, 1]]) 

In [68]: zeros_count 
Out[68]: 
array([[1, 0, 0, 0, 0, 0, 1, 1, 1, 0], 
     [0, 0, 0, 0, 2, 0, 0, 0, 2, 2]]) 

など、高次元の配列については

+0

はい!問題を解決します。ありがとうございました。 – Akshay

+0

私は3D配列を持っているので、関数を定義してループに入れるだけです。右?または効率的な方法がありますか? – Akshay

+1

@akshay私はあなたが '0 'を' 1'、すなわち 'a.sum(1)'、 'a.shape [1]'と 'a.argmax(1)'に変えるだけでよいと思うでしょう。その3D配列から '2D'スライスをどのように解釈するのでしょうか? – Divakar

関連する問題