gpt4 book ai didi

python - 为什么 Python/Numpy 需要行向量来表示矩阵/向量点积?

转载 作者:行者123 更新时间:2023-12-02 05:15:44 25 4
gpt4 key购买 nike

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

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

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

最佳答案

我们首先来了解 dot 是如何实现的操作在 numpy 中定义。

(为了简单起见,将广播规则排除在讨论之外)如果 A 的最后一个维度(即 A.shape[-1]) 如果 B.ndim>=2,则与 B 的倒数第二个维度(即 B.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() 与 b 相同。 b 是一个 1dim 数组,当 transposed 时,仍然是一个 1dim 数组。转置不会影响 1dim 数组。

关于python - 为什么 Python/Numpy 需要行向量来表示矩阵/向量点积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com