Я пытаюсь сделать продукт Адамара 3-D с 2-D массивом.2-D массив разделяет форму первых двух осей 3-D массива и должен быть перемещен вдоль 2-й оси (таким образом, 3-й) для умножения, что означает: сделать продукт Адамара с срезом 0, затем срезом 1,и т. д. (см. изображение, схема).
Исходный трехмерный массив представляет собой opencv
изображение, поэтому имеет форму fe (1080, 1920, 3)
.2-D массив - это один фрагмент этого изображения, поэтому он имеет форму (1080, 1920)
. Есть ли способ сделать это без циклов или с указанием каждого фрагмента самостоятельно?Или петли способ пойти сюда?
Что работает:
img_new = np.zeros(shape=img.shape[:2])
img_new[0] = (img[:, :, 1] * img[:, :, 0])[0]
img_new[1] = (img[:, :, 2] * img[:, :, 0])[1]
Однако я бы предпочел, чтобы в коде не было этого вычисления 2 раза.
Я пытался:
img_new = np.multiply(img_cvt[:, :, 1:3], img[:, :, 0])
Хотя это работает при использовании 2-D и 1-D массивов
>>> a = np.array(((1,2),(3,4)))
>>> b = np.array((5,8))
>>> np.multiply(a,b)
array([[ 5, 16],
[15, 32]])
В 3-D / 2-D случае выдает ошибку вещания:
ValueError: operands could not be broadcast together with shapes (1080,1920,2) (1080,1920)
То же самое относится к np.apply_along_axis
:
img_new = np.apply_along_axis(np.multiply, 2, img[:, :, 1:3], img[:, :, 0])
Что приводит к следующему:
ValueError: operands could not be broadcast together with shapes (2,) (1080,1920)
Но я думаю, это не могло работать, потому что оно предназначено для 1d функций ...