如何在这个numpy的例子中应用广播?

时间:2015-07-12 14:51:16

标签: python numpy numpy-broadcasting

我正在学习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矩阵。这个推理有什么问题?

2 个答案:

答案 0 :(得分:5)

正常广播不适用于np.dot。它的文档说:

  

对于N维,它是a的最后一个轴上的和积   b ::

的倒数第二位

y(3,); r(3,1)

y*r广告适用时,y会重新转换为(1,3),结果为(3,3)

np.dot(y,r)中,y的最后一个轴是3r的倒数第二个轴也是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)的最后一个轴是r1的倒数第二个(仅)是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应该推断这个,但我想"明确比隐含更好"