当使用*关于numpy.array和numpy.matrix

时间:2017-06-21 03:55:36

标签: python arrays numpy matrix

我有两个numpy数组:

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

当我使用a*b.T时,我认为输出错误,因为它们的形状存在差异(使用*对数组执行逐元素乘法)。 但结果会返回矩阵乘法,如下所示:

[[ 4, 5],
 [ 8, 10],
 [12, 15]]

# this shape is (3, 2)

为什么它会像这样工作?

1 个答案:

答案 0 :(得分:1)

您的a * b.T是元素乘法,因broadcasting而有效。另外,以及许多其他二元操作都适用于这对形状。

a是(3,1)。 b.T是(1,2)。广播将(3,1)与(1,2)组合以产生(3,2)。调整尺寸1尺寸以匹配其他非零尺寸。

除非您使用np.matrix制作数组,否则*不会执行数学matrix multiplicationnp.dot用于执行该操作(@np.einsum也执行此操作。)

通过这种特殊的形状组合,dot产品是相同的。 np.outer(a,b)也产生了这个数学outer productnp.dota的最后一维与b.T的第二维匹配。在这种情况下,当共享维度包含多个项目时,dot会更有趣,从而产生熟悉的sum of products

In [5]: np.dot(a, b.T)
Out[5]: 
array([[ 4,  5],
       [ 8, 10],
       [12, 15]])

'外'此外:

In [3]: a + b.T
Out[3]: 
array([[5, 6],
       [6, 7],
       [7, 8]])

这样查看ab可能有所帮助:

In [7]: a
Out[7]: 
array([[1],
       [2],
       [3]])
In [8]: b
Out[8]: 
array([[4],
       [5]])
In [9]: b.T
Out[9]: array([[4, 5]])

我通常不会使用matrix来讨论numpy数组,除非它们是使用np.matrix或更频繁scipy.sparse创建的。 numpy数组可以是0d,1d,2d和更高。我更注重形状而不是名字。