有没有办法优化这段代码?使用我当前的im
值,我需要大约28秒。想知道我是否可以缩短这段时间。
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.shape
和image_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 :(得分:1)
向量化的唯一障碍似乎是IF
条件avg
。要通过它,只需使用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]