我有两个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)
为什么它会像这样工作?
答案 0 :(得分:1)
您的a * b.T
是元素乘法,因broadcasting
而有效。另外,以及许多其他二元操作都适用于这对形状。
a
是(3,1)。 b.T
是(1,2)。广播将(3,1)与(1,2)组合以产生(3,2)。调整尺寸1尺寸以匹配其他非零尺寸。
除非您使用np.matrix
制作数组,否则*
不会执行数学matrix multiplication
。 np.dot
用于执行该操作(@
和np.einsum
也执行此操作。)
通过这种特殊的形状组合,dot
产品是相同的。 np.outer(a,b)
也产生了这个数学outer product
。 np.dot
将a
的最后一维与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]])
这样查看a
和b
可能有所帮助:
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和更高。我更注重形状而不是名字。