numpy矩阵向量乘法[重复]

Posted

技术标签:

【中文标题】numpy矩阵向量乘法[重复]【英文标题】:numpy matrix vector multiplication [duplicate] 【发布时间】:2014-03-01 01:00:36 【问题描述】:

当我将两个大小为 (n x n)*(n x 1) 的 numpy 数组相乘时,我得到一个大小为 (n x n) 的矩阵。按照正常的矩阵乘法规则,需要一个 (n x 1) 向量,但我根本无法在 Python 的 Numpy 模块中找到有关如何完成此操作的任何信息。

问题是我不想手动实现它以保持程序的速度。

示例代码如下:

a = np.array([[5, 1, 3], [1, 1, 1], [1, 2, 1]])
b = np.array([1, 2, 3])

print a*b
   >>
   [[5 2 9]
   [1 2 3]
   [1 4 3]]

我想要的是:

print a*b
   >>
   [16 6 8]

【问题讨论】:

【参考方案1】:

最简单的解决方案

使用numpy.dota.dot(b)。请参阅文档here。

>>> a = np.array([[ 5, 1 ,3], 
                  [ 1, 1 ,1], 
                  [ 1, 2 ,1]])
>>> b = np.array([1, 2, 3])
>>> print a.dot(b)
array([16, 6, 8])

这是因为 numpy 数组不是矩阵,标准操作 *, +, -, / 在数组上按元素工作。

请注意,虽然您可以使用 numpy.matrix(截至 2021 年初),其中 * 将被视为标准矩阵乘法,numpy.matrix 已弃用,可能会在未来的版本中删除。。见the note in its documentation(转载如下):

不再推荐使用这个类,即使是线性代数。而是使用常规数组。将来可能会删除该类。

感谢@HopeKing。


其他解决方案

还知道还有其他选择:

如下所述,如果使用 python3.5+,@ 运算符将按您的预期工作:

>>> print(a @ b)
array([16, 6, 8])

如果你想矫枉过正,你可以使用numpy.einsum。该文档将让您了解它的工作原理,但老实说,直到阅读 this answer 并自己玩弄它,我才完全了解如何使用它。

>>> np.einsum('ji,i->j', a, b)
array([16, 6, 8])

从 2016 年年中(numpy 1.10.1)开始,您可以尝试实验性的 numpy.matmul,它的工作方式类似于 numpy.dot,但有两个主要例外:没有标量乘法,但它适用于矩阵堆栈。

>>> np.matmul(a, b)
array([16, 6, 8])

numpy.inner 的功能与numpy.dot 相同用于矩阵-向量乘法,但行为不同用于矩阵-矩阵和张量乘法(请参阅***,了解一般the inner product and dot product 或@ 987654329@ 关于 numpy 的实现)。

>>> np.inner(a, b)
array([16, 6, 8])

# Beware using for matrix-matrix multiplication though!
>>> b = a.T
>>> np.dot(a, b)
array([[35,  9, 10],
       [ 9,  3,  4],
       [10,  4,  6]])
>>> np.inner(a, b) 
array([[29, 12, 19],
       [ 7,  4,  5],
       [ 8,  5,  6]])

边缘情况的稀有选项

如果您有张量(维度大于或等于 1 的数组),您可以使用 numpy.tensordot 和可选参数 axes=1

>>> np.tensordot(a, b, axes=1)
array([16,  6,  8])

如果你有一个复数矩阵,不要使用numpy.vdot,因为矩阵将被展平为一维数组,然后它会尝试找到你之间的复共轭点积扁平化矩阵和向量(由于n*mn 的大小不匹配而失败)。

【讨论】:

IMP 注意:为了支持数组,应避免使用 numpy 矩阵。文档中的注释->“不再建议使用此类,即使对于线性代数也是如此。而是使用常规数组。将来可能会删除该类。”另请参阅 ***.com/a/61156350/6043669 优秀答案 wflynny

以上是关于numpy矩阵向量乘法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

向量乘法矩阵[重复]

如何将两个向量相乘并得到一个矩阵?

Python: 向量矩阵和多维数组(基于NumPy库)

python数据分析-02numpy库

向量矩阵乘法、浮点向量、二进制矩阵

向量乘法(矩阵乘法)奇数输出的向量