Вы можете создать маску для выборочной работы с элементами вашего массива.Это проще визуализировать с помощью двухмерных массивов, например, ради:
import numpy as np
a = np.random.randint(0, 10, (5, 4))
b = np.random.randint(0, 10, (5, 4))
Давайте посмотрим, как выглядят a и b.
In [317]: a
Out[317]:
array([[6, 0, 4, 0],
[1, 9, 1, 6],
[7, 2, 5, 0],
[8, 3, 5, 0],
[1, 8, 1, 6]])
In [318]: b
Out[318]:
array([[1, 3, 2, 1],
[9, 1, 9, 4],
[9, 4, 5, 5],
[6, 0, 6, 4],
[5, 1, 1, 2]])
Предположим, мы хотим выбрать места, где a == 0 и b == 3, мы строим индекс (маску).idx = (a == 0) & (b == 3)
Как выглядит idx?
In [320]: idx
Out[320]:
array([[False, True, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]])
Теперь, если вы хотите работать с массивом a, где a == 0и b == 3 (предположим, что мы хотим сделать значение a равным значению b:
a[idx] = b[idx]
Теперь, как выглядит?
In [322]: a
Out[322]:
array([[6, 3, 4, 0],
[1, 9, 1, 6],
[7, 2, 5, 0],
[8, 3, 5, 0],
[1, 8, 1, 6]])
Имея это знание в руках,Вы можете применить тот же метод к трехмерным массивам (хотя их сложнее визуализировать).
# identify pixels that are NOT black (i.e. not equal to 0 0 0)
idx = (image1[:, :, 0] == 0) & (image1[:, :, 1] == 0) & (image1[:, :, 2] == 0)
image1[~idx] = image2[~idx]