2015-07-12 56 views
4

我在学习numpy,对广播有点困惑,这里是我的设置。我有两个矩阵广播如何在这个numpy的例子中应用?

>>> y=np.array([1,2,3]) 
>>> v = np.array([1,2,3]) 
>>> r=np.reshape(v, (3, 1)) 

因此r是(3 * 1)矩阵,而y是形状为(3,)的秩为1的矩阵。如果我做了y.dot(r),我得到了14,假设numpy在y上应用广播,使它成为(1 * 3),然后用r(3 * 1)做点积,这样得到的矩阵将是1 * 1。

但是,当我做r.dot(y)时,它会引发错误。它为什么不在这里做同样的事情?它应该使y(1 * 3)和r是(3 * 1),它应该给出一个3 * 3的矩阵。这个推理有什么问题?

回答

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,)。请注意,如果y开始作为(1,3),结果为2d:

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)

In [449]: np.dot(r,y.reshape(1,3)) 
Out[449]: 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 
2

这就像纸上的矩阵乘法,其中两个内部维度需要一致。所以,如果你想不仅[R需要是形状(3,1),但Ÿ必须形状(1,3)不是一个3×3(3)

像这样:

In [60]: r.dot(y.reshape(1,-1)) 
Out[60]: 
array([[1, 2, 3], 
     [2, 4, 6], 
     [3, 6, 9]]) 

我觉得numpy应该推断这一点,但我猜“明确比隐含更好”