2017-10-18 13 views
0

このコードスニペットを最適化する方法はありますか?私の現在のim値では、私は〜28秒かかります。この時間を短縮できるかどうかわかりました。NumPyのイメージの繰り返しと値の変更を最適化する

im = output_image[-min_xy[1]:-min_xy[1] + image_2.shape[0], -min_xy[0]:-min_xy[0] + image_2.shape[1]] 
    for idx, rk in enumerate(im): 
     for ix, k in enumerate(rk): 
      image_2[idx][ix] = avg(im[idx][ix], image_2[idx][ix]) 

type(image_2)type(im)<type 'numpy.ndarray'>

im.shapeimage_2.shapeは何を私のavg()がないことである(2386, 3200, 3)

である

def avg(a1, a2): 
    if [0., 0., 0.] in a1: 
     return a2 
    else: 
     return (a1 + a2)/2 

注:a1はサイズ3元の配列です:array([ 0.68627451, 0.5372549 , 0.4745098])

+0

は、あなたのアルゴリズムは、任意の行列変換や操作のように振る舞うかどうかを確認してみ? –

+0

'a1'の' if [0.、0.、0.]で、 'a1'の**人がゼロであるかどうかのチェック**。あなたはそれをしてもよろしいですか? – Divakar

+0

@Liondancerそれは私の質問に答えることができませんでした。 - a1の '[0.、0.、0. 0]で、' a1'の 'ALL'要素が0かどうかを調べようとしていますか?if 'ANY'の' a1'の要素の1つはゼロですか? – Divakar

答えて

1

には、IFの条件付きベクトル化の唯一の障害がありました。それを乗り越えるためには、単にそのように私たちのソリューションを持っているので、np.whereの選んだ機能を使用して - これはif [0., 0., 0.] in a1と想定していることを

avgs = (im + image_2)/2.0 
image_2_out = np.where((im == 0).any(-1,keepdims=1), image_2, avgs) 

注意を、あなたはANY 1試合をチェックするためのもの。 ALLのゼロをチェックする場合は、.anyの代わりに.allを使用してください。 image_2にその場で編集を行うための別の方法として

boolean-indexingためのマスクを使用する -

mask = ~(im == 0).any(-1) 
image_2[mask] = avgs[mask] 
関連する問題