编程语言
首页 > 编程语言> > 为什么Python / Numpy需要矩形/矢量点积的行向量?

为什么Python / Numpy需要矩形/矢量点积的行向量?

作者:互联网

假设我们想要计算矩阵和列向量的点积:

Matrix dot vector

所以在Numpy / Python中我们走了:

a=numpy.asarray([[1,2,3], [4,5,6], [7,8,9]])
b=numpy.asarray([[2],[1],[3]])
a.dot(b)

结果是:

array([[13],
[31],
[49]])

到目前为止,这么好,但为什么这也有效?

b=numpy.asarray([2,1,3])
a.dot(b)

结果是:

array([13, 31, 49])

我希望[2,1,3]是行向量(需要转置才能应用点积),但Numpy似乎默认将数组视为列向量(在矩阵乘法的情况下)?

这是如何运作的?

编辑:

为什么:

b=numpy.asarray([2,1,3])
b.transpose()==b

因此矩阵点矢量数组确实有效(因此它将其视为列向量),但是其他操作(转置)不起作用.这不是真的一致设计不是吗?

解决方法:

让我们首先了解如何在numpy中定义dot操作.

(为简单起见,将广播规则排除在讨论范围之外)如果A的最后一个维度(即A.shape [-1])与B的倒数第二个维度相同,则可以执行点(A,B) (即B.shape [-2])如果B.ndim> = 2,则简单地说B的尺寸如果B.ndim == 1.

换句话说,如果A.shape =(N1,…,Nk,X)和B.shape =(M1,…,M(j-1),X,Mj)(注意共同的X).生成的数组将具有形状(N1,…,Nk,M1,…,Mj)(注意X被删除).

或者,如果A.shape =(N1,…,Nk,X)和B.shape =(X,).生成的数组将具有形状(N1,…,Nk)(请注意X已被删除).

您的示例有效,因为它们满足规则(第一个示例满足第一个示例,第二个示例满足第二个示例):

a=numpy.asarray([[1,2,3], [4,5,6], [7,8,9]])
b=numpy.asarray([[2],[1],[3]])
a.shape, b.shape, '->', a.dot(b).shape  # X=3
=> ((3, 3), (3, 1), '->', (3, 1))

b=numpy.asarray([2,1,3])
a.shape, b.shape, '->', a.dot(b).shape  # X=3
=> ((3, 3), (3,), '->', (3,))

我的建议是,当使用numpy时,不要考虑“行/列向量”,如果可能的话,根本不考虑“向量”,而是用“带有形状S的数组” .这意味着行向量和列向量都只是“1dim数组”.就numpy而言,它们是同一个.

这也应该说明为什么在你的情况下b.transponse()与b相同. b为1dim数组,当transposed时,仍为1dim数组.转置不会影响1dim数组.

标签:python,numpy,numpy-broadcasting
来源: https://codeday.me/bug/20190523/1156737.html