gpt4 book ai didi

python - 如何用numpy制作沿轴的Hadamard积?

转载 作者:行者123 更新时间:2023-12-01 01:20:14 28 4
gpt4 key购买 nike

我正在尝试使用 2-D 数组制作 3-D 的 Hadamard 乘积。 2 维数组共享 3 维数组前两个轴的形状,并且应该沿着第 2 轴(即第 3 个轴)移动以进行乘法,这意味着:先与切片 0 进行哈达玛积,然后与切片 1 进行哈达玛积,等等(参见图片、原理图)。

原始 3-D 数组是一个 opencv 图像,因此具有 f.e. 的形状。 (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)

但我想这行不通,因为它是为一维函数设计的......

Desired array multiplication

最佳答案

看看如何 broadcasting作品。本质上,您可以附加一个轴来执行元素明智的操作,例如这有效

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

关于python - 如何用numpy制作沿轴的Hadamard积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53908051/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com