2017-03-05 10 views
1

配列計算を行うための最も効率的でpythonicなアルゴリズムを探しています。ここで問題がある:配列計算のためのPythonicアルゴリズム

次のようにIが軸= 0に沿った形状のアレイ(5,2,3)と、その和を持っている:

import numpy as np 
A = np.array([[[ 6, 15, 89], 
       [49, 62, 12]], 

       [[92, 8, 34], 
       [93, 81, 35]], 

       [[ 8, 35, 63], 
       [68, 89, 5]], 

       [[27, 20, 85], 
       [87, 42, 90]], 

       [[99, 64, 12], 
       [90, 93, 87]]]) 

B = A.sum(axis=0) 

だからBがあるA[0]+A[1]+A[2]+A[3]+A[4]と基本的に同じです。

array([[232, 142, 283], 
     [387, 367, 229]]) 

私は要素B[0,0]は、3つのステップの後に100以上になるBの6つの要素のそれぞれは、例えば、100よりも大きいを行ってきました、合計プロセスのどの段階で知りたい:A[0]+A[1]+A[2]、またはB[1,1]は後に100以上になります2ステップA[0]+A[1]。 だから、アルゴリズムの最終出力は、この配列でなければなりません:

array([[3, 5, 2], 
     [2, 2, 4]]) 

私は別に、各要素のための計算を行うことができます知っているが、誰もが創造的かつ高速なアルゴリズムを考え出すことができれば、私は思っていました。

乾杯、

答えて

4

使用cumsum、累積合計を取得し、しきい値に対してそれを比較し、最終的にその閾値を横切るの最初のインスタンスとしてそれをキャッチするargmaxを使用する -

(A.cumsum(axis=0) > 100).argmax(axis=0)+1 

サンプル実行 -

In [228]: A 
Out[228]: 
array([[[ 6, 15, 89], 
     [49, 62, 12]], 

     [[92, 8, 34], 
     [93, 81, 35]], 

     [[ 8, 35, 63], 
     [68, 89, 5]], 

     [[27, 20, 85], 
     [87, 42, 90]], 

     [[99, 64, 12], 
     [90, 93, 87]]]) 

In [229]: (A.cumsum(0) > 100).argmax(0)+1 
Out[229]: 
array([[3, 5, 2], 
     [2, 2, 4]]) 
+0

これは素晴らしいことでした。ありがとう – Monobakht

関連する問題