4

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

4

2 回答 2

5

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

对于 N 维,它是::的最后一个轴a和倒数第二个轴的和积b

y(3,)r(3,1)

y*r中,广播适用,y被重塑为(1,3),结果为(3,3)

np.dot(y,r)中,最后一个轴y3,倒数第二个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),最后一个轴r1,倒数第二个(仅)y3- 因此不匹配。

扩展y确实会产生(3,3)

In [449]: np.dot(r,y.reshape(1,3))
Out[449]: 
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])
于 2015-07-12T15:28:01.980 回答
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 应该推断这一点,但我猜“显式优于隐式”

于 2015-07-12T15:05:07.143 回答