np.multiply如何工作?

汉斯·贡德拉赫

我正在尝试用Java实现np.multiply,我对其实际操作感到困惑。该文档只是简单说明了它按元素进行乘法。它与我找不到的任何数学矩阵乘积都不匹配。它与按元素方式的Hadamard乘积部分匹配,但不需要相同数量的行和列。有谁知道np.multiply会执行什么数学运算,并且确切了解它的工作原理吗?

这是我得到的不同输出。这些似乎功能截然不同。

a = np.array([[1,1,1],[2,2,2],[2,3]])
b = np.array([[2,3,4]])
print(np.multiply(a,b))
#output
[[1, 1, 1, 1, 1, 1] [2, 2, 2, 2, 2, 2, 2, 2, 2] [2, 3, 2, 3, 2, 3, 2, 3]]]

a = np.array([[1,1,1],[2,2,2]])
b = np.array([[2,3,4]])
print(np.multiply(a,b))
#output
[[2 3 4]
 [4 6 8]]
米尔森

就像文档中所说的那样,它正在做逐元素乘法。注意,在第一个示例中,

a = np.array([[1,1,1],[2,2,2],[2,3]])
b = np.array([[2,3,4]])

您有一个对象(列表)数组,因为所有子列表的长度都不相同。

>>> a = np.array([[1,1,1],[2,2,2],[2,3]])
>>> a
array([[1, 1, 1], [2, 2, 2], [2, 3]], dtype=object)

因此,当您将它们相乘时,就是将一个列表与一个整数相乘,即得到的结果。

例如,如果c = np.multiply(a, b)

c[0] == [1, 1, 1] * 2
c[1] == [2, 2, 2] * 3
c[2] == [2, 3] * 4

到目前为止,我们看到相同形状的乘法数组产生了Handamard积如果它们的形状不同怎么办?在这种情况下,numpy尝试将它们“广播”为相同的形状。这些规则可能有些复杂,因此我不会在此处尝试复制它们,但是可以在http://docs.scipy.org/doc/numpy-1.10.1/user/basics.broadcasting.html中找到它们标量数组乘法的工作原理与数学中的标量矩阵乘法的工作原理相同。对于形状不相同的阵列,尾随尺寸必须匹配,并且尺寸较小的阵列会重复进行必要的多次重复以填写缺失的尺寸,然后执行Handamard产品。

例如

a = np.array([[1, 2, 3], [1, 2, 3]])
b = np.array([3, 2, 1])
c = np.array([[3, 2, 1], [3, 2, 1]])

在这种情况下,a * ba * c会给出相同的结果。


显然,我描述它的方式不是实现方式(这将是非常低效的),但它可以作为一种思考方式。


本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章