【问题标题】:Why do Python/Numpy require a row vector for matrix/vector dot product?为什么 Python/Numpy 需要矩阵/向量点积的行向量?
【发布时间】:2016-04-09 00:33:20
【问题描述】:

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

所以我们开始使用 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

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

【问题讨论】:

  • array([2, 1, 3]) 不是行向量或列向量。它只是一个向量。
  • @user2357112 你应该称它为向量吗?我认为这是这种常见混淆的主要来源。人们通常通过“向量”来指代[n x 1][1 x n] 对象。但正如我所看到的,关键在于 1d ndarray 具有一维,所以我会说它不是向量,而是数组。 (当然,有一些特殊的 nd 数组可以被认为是向量或矩阵,即 n==2:)
  • `[[1,2,3]]`会发生什么?

标签: python numpy array-broadcasting


【解决方案1】:

我们先来了解一下dot操作在numpy中是如何定义的。

(为简单起见,不讨论广播规则)如果 A 的最后一个维度(即A.shape[-1])与 B 的倒数第二个维度(即 B.如果 B.ndim>=2,则 shape[-2]),如果 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 已被删除)。

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

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() is the same as bb 是 1dim 数组,当 transposed 时,仍然是 1dim 数组。转置不影响 1dim 数组。

【讨论】:

  • numpy.dot 不是这样对待维度大于 2 的参数的。我建议您将高维度行为排除在您的答案之外; dot 的高维行为不是很有用。
  • @user2357112,感谢您指出这一点。我修正了我的答案。
  • @user2357112 “dot 的高维行为不是很有用” - 也许对你没有用!
  • Transpose 不能在一维数组上工作对于从任何其他软件/语言切换到 numpy 的任何人来说都是最烦人的事情。在我看来,一维数组应该是例外而不是默认值。
  • @AndrasDeak 我选择atleast_2D 并自动完成道具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2018-12-05
相关资源
最近更新 更多