Если вы абсолютно хотите иметь маску будучи (2560, 1920, 3)
, вы можете просто развернуть его вдоль оси (есть несколько способов сделать это, но это один довольно простой):
>>> mask = np.random.random_integers(0, 255, (15, 12))
>>> mask_3d = mask[:, :, None] * np.ones(3, dtype=int)[None, None, :]
>>> mask.shape
(15L, 12L)
>>> mask_3d.shape
(15L, 12L, 3L)
Однако в В общем, вы можете использовать эти broadcasts напрямую. Например, если вы хотите, чтобы умножить свое изображение на вашей маске:
>>> img = np.random.random_integers(0, 255, (15, 12, 3))
>>> img.shape
(15L, 12L, 3L)
>>> converted = img * mask[:, :, None]
>>> converted.shape
(15L, 12L, 3L)
Таким образом, вы никогда не есть создать (n, m, 3)
маску: Вещание осуществляется на лету, управляя шагами массива маски, а не создавая большую, избыточную. Большинство Numpy поддержка операций такого рода вещание: бинарные операции (как описано выше), но и indexing:
>>> # Take the lower part of the image
>>> mask = np.tri(15, 12, dtype=bool)
>>> # Apply mask to first channel
>>> one_channel = img[:, :, 0][mask]
>>> one_channel.shape
(114L,)
>>> # Apply mask to all channels
>>> pixels = img[mask]
>>> pixels.shape
(114L, 3L)
>>> np.all(pixels[:, 0] == one_channel)
True
Спасибо, что помогло. Второй отрывок особенно. :) –