[英]when use * about numpy.array and numpy.matrix
我有两个numpy数组:
a = np.array([1, 2, 3]).reshape(3, 1)
b = np.array([4, 5]).reshape(2,1)
当我使用a*bT
,我在想一个错误的输出,因为它们的形状有所不同(使用*
对数组执行逐元素乘法)。 但是结果返回矩阵乘法,如下所示:
[[ 4, 5],
[ 8, 10],
[12, 15]]
# this shape is (3, 2)
为什么会这样工作?
您的a * bT
是元素乘法,并且由于broadcasting
而起作用。 加法和许多其他二进制操作都可以使用这对形状。
a
是(3,1)。 bT
为(1,2)。 广播将(3,1)与(1,2)组合在一起产生(3,2)。 调整大小为1的尺寸以匹配其他非零尺寸。
除非使用np.matrix
制作数组, np.matrix
*
不会执行数学matrix multiplication
。 np.dot
用于执行该操作( @
和np.einsum
也可以执行此操作)。
通过这种特殊的形状组合, dot
积是相同的。 np.outer(a,b)
也会产生这个outer product
数学outer product
。 np.dot
将a
的最后一个维度与bT
的第二个维度匹配到最后一个维度。 在这种情况下,它们都是1.共享维度具有多个项目时, 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或更高。 我比名字更注重形状。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.