我正在学习numpy并且对广播感到有点困惑,这是我的设置。我有两个矩阵
>>> y=np.array([1,2,3])
>>> v = np.array([1,2,3])
>>> r=np.reshape(v, (3, 1))
所以r是(3 * 1)矩阵,而y是秩1矩阵,形状为(3,)。
如果我做y.dot(r),我得到14,假设numpy在y上应用广播,使它(1 * 3)然后它用r(3 * 1)做点积,所以得到的矩阵将是1 * 1.
然而,当我执行r.dot(y)时,它会抛出错误。为什么它在这里做同样的事情呢?应该使y(1 * 3)和r为(3 * 1),它应该给出3 * 3矩阵。这个推理有什么问题?
答案 0 :(得分:5)
正常广播不适用于np.dot
。它的文档说:
对于N维,它是
的倒数第二位a
的最后一个轴上的和积b
::
y
是(3,)
; r
为(3,1)
。
在y*r
广告适用时,y
会重新转换为(1,3)
,结果为(3,3)
。
在np.dot(y,r)
中,y
的最后一个轴是3
,r
的倒数第二个轴也是3
,乘以和求和,形状为{ {1}}。请注意,如果(1,)
以y
开头,则结果为2d:
(1,3)
在In [445]: np.dot(y.reshape(1,3),r).shape
Out[445]: (1, 1)
中,np.dot(r,y)
的最后一个轴是r
,1
的倒数第二个(仅)是y
- 因此不匹配。
展开3
会产生y
:
(3,3)
答案 1 :(得分:2)
它就像纸上的矩阵乘法一样,两个内部维度需要一致。因此,如果你想要一个3x3不仅r需要是形状(3,1),但y需要是形状(1,3)而不是(3,)
像这样:
In [60]: r.dot(y.reshape(1,-1))
Out[60]:
array([[1, 2, 3],
[2, 4, 6],
[3, 6, 9]])
我觉得numpy应该推断这个,但我想"明确比隐含更好"