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

为什么Python/Numpy需要矩阵/向量点积的行向量?,python,numpy,array-broadcasting,Python,Numpy,Array Broadcasting,假设我们要计算矩阵和列向量的点积: 因此,在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/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

因此矩阵-点-向量数组可以工作(因此它将其视为列向量),但是其他操作(转置)不起作用。这不是真正一致的设计,不是吗?

让我们先了解一下numpy中是如何定义操作的

b=numpy.asarray([2,1,3])
a.dot(b)
(为了简单起见,将广播规则排除在讨论之外)如果A的最后一个维度(即
A.shape[-1]
)与B的下一个最后一个维度(即B.shape[-2])相同(如果B.ndim>=2),则可以执行
dot(A,B)
,如果B.ndim==1,则只执行B的维度

换句话说,如果
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
已删除)

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


我的建议是,在使用numpy时,不要考虑“行/列向量”,如果可能的话,也不要考虑“向量”,而是考虑“形状为S的数组”。这意味着行向量和列向量都只是“1dim数组”。就numpy而言,他们是一体的


这也应该清楚为什么在你的例子中
b.transponse()与b
相同<代码>b作为1dim数组,当,仍然是1dim数组。转置不会影响1dim数组。

相关问题:
数组([2,1,3])
不是行向量或列向量。它只是一个向量。@user2357112你应该称它为向量吗?我认为这是这种经常出现的混乱的主要根源。通过“向量”,人们通常指的是
[n x 1]
[1 x n]
对象。但在我看来,关键是1d
ndarray
只有一个维度,所以我认为它不是一个向量,而是一个数组。(当然,有一些特殊的nd数组可以被认为是向量或矩阵,即
n==2
:)对于“`[[1,2,3]]”会发生什么?这不是
numpy.dot
处理维度高于2的参数的方式。我建议你不要回答高维行为;dot的高维行为不是很有用。@user2357112,谢谢你指出这一点。我修正了我的答案。@user2357112“dot的高维行为不是很有用”-也许对你来说不是!对于从任何其他软件/语言切换到numpy的人来说,转置不在1D阵列上工作是最烦人的事情。在我看来,1D数组应该是例外,而不是默认的。@AndrasDeak取而代之的是
至少\u 2D
和自动完成道具。