优化NumPy迭代图像和更改值

时间:2017-10-18 22:21:45

标签: python numpy

有没有办法优化这段代码?使用我当前的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.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])

1 个答案:

答案 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]