我正在尝试使用 2-D 阵列制作 3-D 的 Hadamard 产品。2-D 数组共享 3-D 数组的前两个轴的形状,应该沿着 2 轴(因此,第 3 轴)移动以进行乘法运算,这意味着:用切片 0 制作 Hadamard 积,然后切片 1,等等(参见图像,示意图)。
原始的 3-D 数组是一个opencv
图像,因此具有 fe 的形状(1080, 1920, 3)
。二维阵列是该图像的一个切片,因此其形状为(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]
但是,我不希望在代码中进行两次计算。
我试过了:
img_new = np.multiply(img_cvt[:, :, 1:3], img[:, :, 0])
虽然这在使用二维和一维数组时有效
>>> 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)
但我想这行不通,因为它是为一维函数设计的......