2013-05-16 7 views
5

私はnumpyで大きな3次元配列を持っています(サイズは100x100x100と言うことができます)。私は何度も何度も(要素の約70%)その部分を反復したいと思います。そして、同じサイズのブール値行列を持ち、その要素が操作を行うかどうかを定義します。numpy配列の一部で繰り返し処理を高速化するには

私の現在の方法は、形状の配列「COORDS」(N、3)の操作を行うには、その後

for i in np.arange(many_iterations): 
    for j in coords: 
     large_array[j] = do_something(large_array[tuple(j)]) 

が、それは実際には良いだろうれているすべてのCOORDSが含まれて作成する最初にありますブール配列をテストするために、ループ全体に評価を加え、ループ内に余分な演算を含めることができます(真理の評価は、1回ではなく複数回実行されることに注意してください)。私の考えは、この場合の賃金オフは、この最後の行は、このケースで動作させることでしょうどのようにループ

large_array = do_something(large_array if condition True) 

ために退治されるだろうということでしたか?

+0

'do_something 'が何であるかに応じて、' large_array [boolean_array] = do_something(large_array [boolean_array]) 'やもっと短いものができるかもしれません。 –

+0

あなたの感想は正しいと思います。配列全体の操作を行い、 'numpy.where'のようなものを使用するとあなたの利益になるかもしれません。 –

答えて

3

あなたが最初にあなたが動作しなければならない場所を定義するブール値の配列を作成することで、より良いパフォーマンスを得るかもしれません:そのような

big_3d_arr = some 100x100x100 array 
where_to_operate_arr = big_3d_arr < 500 # or whatever your condition is 
big_3d_arr[where_to_operate_arr] = do_something(big_3d_arr[where_to_operate_arr]) 

何かがうまくいくかもしれない、しかし、再び、あなたはチャンクでブールインデックスを反復して行う必要がありアプリケーションによって異なります。

+0

ありがとう、これは私が必要としていたものです。 do_somethingは、配列の各要素を取得し、それを周囲の要素の平均とする関数です(配列をコピーしてから配列をオフセットして追加する一連のnp.rollを使用します)。私はまだマスクされたデータを使用しているので、最後にマスクに対して決定しました。このソリューションよりも少し複雑に思えました。 – Rowan

3

基本的にはmasked arraysを作り直そうとしています。 Thisのページが参考になる。

関連する問題