2017-10-18 22 views
0

有沒有一種方法來優化這段代碼?以我當前的價值,這需要我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(2386, 3200, 3)

什麼我avg()確實是

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,0]來檢查** a1中的任何人是否爲零**。你確定你想要嗎? – Divakar

+0

@Liondancer這不回答我的問題,它是 - 在a1:'中使用'if [0.,0,0,0],你是否試圖檢查'a1'中的'ALL'元素是否爲零或if 'a1'中的「ANY」一個元素爲零? – Divakar

回答

1

向量化的唯一障礙似乎是在avg條件IF。爲了突破它,只需使用的np.where的選擇能力,從而有我們的解決方案,像這樣 -

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

注意,這個假設與if [0., 0., 0.] in a1,你的意思是檢查ANY一個匹配。如果您打算檢查ALL零,只需使用.all而不是.any

或者,做原地編輯在image_2,使用boolean-indexing面具 -

mask = ~(im == 0).any(-1) 
image_2[mask] = avgs[mask]