Давайте попробуем это на небольшом примере, который мы можем визуализировать
Изображение и маска. mask==1
- это то же самое, что преобразование его в логическое значение:
In [280]: img = np.arange(12).reshape(3,4)*10
In [281]: mask = np.zeros((3,4),int); mask[1,1:3]=1
In [282]: mask = mask.astype(bool)
In [283]: mask
Out[283]:
array([[False, False, False, False],
[False, True, True, False],
[False, False, False, False]])
Таким образом, выбранная часть изображения:
In [284]: img[mask]
Out[284]: array([50, 60])
Определите целевой массив 3d:
In [285]: arr = np.arange(24).reshape(2,3,4)
In [286]: arr
Out[286]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
применить маску - с индексом [[0],[1]]
первого измерения:
In [287]: arr[np.arange(arr.shape[0])[:,None],mask]
Out[287]:
array([[ 5, 6],
[17, 18]])
и вставить:
In [288]: arr[np.arange(arr.shape[0])[:,None],mask]=img[mask]
In [289]: arr
Out[289]:
array([[[ 0, 1, 2, 3],
[ 4, 50, 60, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 50, 60, 19],
[20, 21, 22, 23]]])
np.arange(arr.shape[0])[:,None]
- ключ к применению вставка для всех блоков.