numpy比较两个3d数组并找到相同的数组

时间:2019-01-16 16:46:29

标签: python arrays numpy

我有2个数组,

mat = np.array(
    [
        [[0,0],[0,1],[0,2]],
        [[1,0],[1,1],[1,2]],
        [[2,0],[2,1],[2,2]]
    ]
)
mat2 = np.array(
    [
        [[0,1],[0,1],[0,2]],
        [[1,0],[1,1],[1,2]],
        [[2,0],[2,2],[2,2]]
    ]
)

我想找到第2轴上在matmat2中都相同的所有数组,并将它们变成零数组。换句话说,如果每个数组matmat2都是RGB图像,我想找到具有相同R,G,B值的像素,并返回具有设置为(0 ,0,0),其余像素保持不变。

所以我试图通过上述数组实现的输出是这样:

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

我尝试了以下代码:

operated = np.where((mat2-mat==0).all(axis=2), np.array([0,0]), mat2)

但是它会说:

ValueError: operands could not be broadcast together with shapes (3,3) (2,) (3,3,2) 

我认为这是因为它仅对轴2中的每个数组返回一个TrueFalse,如果像素相同,则应返回(True , True),如果相减则应返回(False, False)不应该做。

1 个答案:

答案 0 :(得分:2)

您可以根据以下条件使用np.where替换数组中的值:

np.where((mat == mat2).all(axis=2,  keepdims=True), [0,0], mat2)

array([[[0, 1],
        [0, 0],
        [0, 0]],

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

       [[0, 0],
        [2, 2],
        [0, 0]]])

(mat == mat2).all(axis=2, keepdims=True)处:

array([[[False],
        [ True],
        [ True]],

       [[ True],
        [ True],
        [ True]],

       [[ True],
        [False],
        [ True]]])

返回与mat相同尺寸的蒙版,您可以将其用作np.where的条件。然后,您只需根据结果指定是用[0,0]还是用mat2替换这些值。