Как сделать продукт Адамара по оси с клочком? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь сделать продукт Адамара 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 функций ...

Desired array multiplication

1 Ответ

0 голосов
/ 24 декабря 2018

Посмотрите, как работает вещание .По сути, вы можете добавить ось для выполнения поэлементных операций, например, это работает

import numpy as np

a = np.random.rand(10, 3)
b = np.random.rand(10, 3, 2)

c = b * a[..., np.newaxis] # make a shape 10 x 3 x 1
...