假设我们想要计算矩阵和列向量的点积:
所以在Numpy / Python中我们走了:
a=numpy.asarray([[1,2,3], [4,5,6], [7,8,9]])
b=numpy.asarray([[2],[1],[3]])
a.dot(b)
结果:
阵列([[13], [31], [49]])
到目前为止,这么好,但为什么这也有效?
b=numpy.asarray([2,1,3])
a.dot(b)
结果:
数组([13,31,49])
我希望[2,1,3]是行向量(需要转置才能应用点积),但是Numpy似乎默认将数组视为列向量(在矩阵乘法的情况)?
这是如何运作的?
修改
为什么:
b=numpy.asarray([2,1,3])
b.transpose()==b
因此矩阵点矢量数组确实有效(因此它将其视为列向量),但其他操作(转置)不起作用。这不是真正一致的设计不是吗?
答案 0 :(得分:4)
让我们先了解如何在numpy中定义dot
操作。
(为简单起见,将广播规则排除在讨论范围之外)如果A的最后一个维度(即dot(A,B)
)与B的倒数第二个维度相同,则可以执行A.shape[-1]
(即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时,不要考虑"行/列向量",如果可能的话,不要考虑"向量和"向量& #34;根本不是"一个形状为S"的数组。这意味着行向量和列向量都只是" 1dim数组"。就numpy而言,它们是同一个。
这也应该明确为什么在你的情况b.transponse() is the same as b
。 b
是一个1dim数组,当transposed时,仍然是1dim数组。转置不会影响1dim数组。