Вычислить маску из сравнения значений двух массивов Numpy, которые имеют разные формы - PullRequest
3 голосов
/ 04 июня 2019

Учитывая эти два массива:

a = np.array(
    [
        [
            [1, 102, 103, 255],
            [201, 2, 202, 255],
            [201, 202, 202, 255]
        ],
        [
            [11, 120, 0, 255],
            [0, 0, 0, 255],
            [1, 22, 142, 255]
        ],
    ])

b = np.array(
    [
        [
            [1, 102, 103, 255],
            [201, 2, 202, 255]
        ],
        [
            [11, 120, 0, 255],
            [221, 222, 13, 255]
        ],
        [
            [91, 52, 53, 255],
            [0, 0, 0, 255]
        ],
    ])

a.shape # => (2, 3, 4)
b.shape # => (3, 3, 4)

Я хочу наложить a и b на 0, 0 и вывести маску, которая представляет собой, когда a значения равны b значениям.Сравниваемые значения являются полными пиксельными значениями, поэтому в этом случае [1, 102, 103, 255] является значением.

Такая выходная маска будет великолепной:

result = np.array([
    [
        true,
        true,
        false
    ],
    [
        true,
        false,
        false
    ],
    [
        false,
        false,
        false
    ],
])

Идеальный ответ в моем случаегде совпадающие значения становятся [255, 0, 0, 255], а несовпадающие значения становятся [0, 0, 0, 0]:

result = np.array([
    [
        [255, 0, 0, 255],
        [255, 0, 0, 255],
        [0, 0, 0, 0]
    ],
    [
        [255, 0, 0, 255],
        [0, 0, 0, 0],
        [0, 0, 0, 0]
    ],
    [
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]
    ],
])

result.shape # => (3, 3, 4)

Это выглядит так:

[! [diff между a и b] [1]][1] * * тысяча двадцать-две

1 Ответ

3 голосов
/ 04 июня 2019

Вот одна из возможностей использования нарезки.

outer = np.maximum(a.shape, b.shape)
inner = *map(slice, np.minimum(a.shape, b.shape)),
out = np.zeros(outer, np.result_type(a, b))
out[inner][(a[inner]==b[inner]).all(2)] = 255,0,0,255

out
# array([[[255,   0,   0, 255],
#         [255,   0,   0, 255],
#         [  0,   0,   0,   0]],
#
#        [[255,   0,   0, 255],
#         [  0,   0,   0,   0],
#         [  0,   0,   0,   0]],
#
#        [[  0,   0,   0,   0],
#         [  0,   0,   0,   0],
#         [  0,   0,   0,   0]]])
...