Как объединить массивы NumPy

Имеется изображение разрешением (220, 220), т.е. массив (220, 220, 3) из трёх слоёв RGB. Как к этому массиву добавить ещё четыре слоя (предположим нулевых), не нарушив порядка в изображении. Как я понимаю должен получиться массив с размерами (220, 220, 7) или я ошибаюсь

import numpy as np
a = np.arange(220 * 220 * 3).reshape(220 * 220, 3)
a = np.array(np.vsplit(a, 220))

b = np.zeros(220 * 220 * 4).reshape(220 * 220, 4)
b = np.array(np.vsplit(b, 220))

c = np.vstack((a, b))

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

В numpy традиционно картинки храняться с формате высота * ширина * глубина. Глубина отвечает за количество слоёв в картинке.

Создаём изображение из трёх слоёв. Размер изображения 4 на 5:

@>>> a = np.arange(4 * 5 * 3).reshape(4, 5, 3)
@>>> a[:, :, 0]
array([[ 0,  3,  6,  9, 12],
       [15, 18, 21, 24, 27],
       [30, 33, 36, 39, 42],
       [45, 48, 51, 54, 57]])
@>>> a[:, :, 1]
array([[ 1,  4,  7, 10, 13],
       [16, 19, 22, 25, 28],
       [31, 34, 37, 40, 43],
       [46, 49, 52, 55, 58]])
@>>> a[:, :, 2]
array([[ 2,  5,  8, 11, 14],
       [17, 20, 23, 26, 29],
       [32, 35, 38, 41, 44],
       [47, 50, 53, 56, 59]])

Создаём два дополнительных слоя:

@>>> b = np.zeros((4, 5, 2), dtype=int)
@>>> b[:, :, 0]
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])
@>>> b[:, :, 1]
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

Склеиваем по последней оси:

@>>> c = np.concatenate((a, b), axis=2)
@>>> c[:, :, 2]
array([[ 2,  5,  8, 11, 14],
       [17, 20, 23, 26, 29],
       [32, 35, 38, 41, 44],
       [47, 50, 53, 56, 59]])
@>>> c[:, :, 3]
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])
→ Ссылка