np.multiply如何工作?

时间:2015-12-14 21:58:01

标签: python arrays numpy matrix matrix-multiplication

我正在尝试在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]]

1 个答案:

答案 0 :(得分: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)

因此,当你将它们相乘时,你将列表乘以整数 - 这就是你得到的结果。

e.g。如果c = np.multiply(a, b),那么:

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

到目前为止,我们看到相同形状的乘法数组会产生Handamard product。什么时候他们的形状不一样?在这种情况下,numpy试图将它们“广播”到相同的形状。规则可能有点复杂,所以我不会尝试在这里重现它们,但可以在http://docs.scipy.org/doc/numpy-1.10.1/user/basics.broadcasting.html找到它们。标量数组乘法与数学中的标量矩阵乘法相同。对于形状不相同的阵列,尾随尺寸必须匹配,并且根据需要重复具有较少尺寸的阵列以填充缺失的尺寸,然后执行Handamard产品。

e.g。

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会得到相同的结果。

显然,我所描述的方式不是它的实现方式(效率会非常低效),但它有助于作为一种思考方式。