首页 > 解决方案 > 是否有一个 numpy 函数可以用另一个数组的相同部分替换一个数组

问题描述

我有两个图像存储为 numpy 数组。我正在寻找一个函数,它可以用相同的索引替换array2具有黑色像素 ( ) 的部分。到目前为止,我的代码是非 numpy 的:[0, 0, 0]array1

for y in range(array2.shape[0]):
            for x in range(array2.shape[1]):
                if np.all(array2[y, x]) == False:
                    array2[y, x] = array1[y, x]

代码循环遍历每个像素array2以查看所有通道是否为 0(黑色),如果是,则array1将该索引处的颜色复制到array2.

这显然非常慢,因为它循环了很多不是黑色的像素并且对它们没有影响。我假设 numpy 有一个可以做到这一点的功能,但我不明白他们做了什么。感谢任何指导(有或没有 numpy)。

标签: pythonnumpy

解决方案


这是你想要的吗?(我假设没有负值。)(编辑:但请参阅 Adam.Er8 的评论以解除此限制)

>>> arr1                                                                                                                                             
array([[[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]],

       [[4, 4, 4],
        [5, 5, 5],
        [6, 6, 6]],

       [[7, 7, 7],
        [8, 8, 8],
        [9, 9, 9]]])
>>> arr2
array([[[1, 0, 0],
        [0, 1, 0],
        [0, 0, 1]],

       [[1, 0, 0],
        [0, 1, 0],
        [0, 0, 0]],

       [[1, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]])
>>> idx = arr2.sum(axis=2) == 0
>>> idx
array([[False, False, False],
       [False, False,  True],
       [False,  True,  True]])
>>> arr2[idx] = arr1[idx]
>>> arr2
array([[[1, 0, 0],
        [0, 1, 0],
        [0, 0, 1]],

       [[1, 0, 0],
        [0, 1, 0],
        [6, 6, 6]],

       [[1, 0, 0],
        [8, 8, 8],
        [9, 9, 9]]])

推荐阅读