numpy 矩阵向量乘法[重复]

2025-02-20 09:23:00
admin
原创
26
摘要:问题描述:当我将两个numpy大小为 (nxn)*(nx 1) 的数组相乘时,我得到一个大小为 (nxn) 的矩阵。按照正常的矩阵乘法规则,预期会得到一个 (nx 1) 向量,但我根本找不到有关如何在 Python 的 Numpy 模块中完成此操作的任何信息。问题是我不想手动实现它以保持程序的速度。示例代码如...

问题描述:

当我将两个numpy大小为 (nxn)*(nx 1) 的数组相乘时,我得到一个大小为 (nxn) 的矩阵。按照正常的矩阵乘法规则,预期会得到一个 (nx 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.dot或。请参阅此处 的a.dot(b)文档。

>>> 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但已被弃用,并且可能会在未来的版本中删除。。请参阅其文档中的注释(如下所示):

不再建议使用此类,即使对于线性代数也是如此。请改用常规数组。将来可能会删除该类。

谢谢@HopeKing。


其他解决方案

还知道还有其他选择:

  • 如下所示,如果使用 python3.5+ 和 numpy v1.10+,则该@运算符将按预期工作:

>>> print(a @ b)
array([16, 6, 8])
  • 如果您想要过度使用,可以使用numpy.einsum。文档将让您了解它的工作原理,但老实说,直到阅读这个答案并自己尝试了一下,我才完全理解如何使用它。

>>> 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` 函数方式与矩阵向量乘法相同,但对于矩阵-矩阵和张量乘法的行为不同(有关内积和点积之间的差异,请参阅维基百科,或参阅有关 numpy 实现的SO 答案)。

>>> 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]])
  • 如果您有多个2D 数组需要dot组合,您可以考虑使用该 np.linalg.multi_dot函数,它简化了多个嵌套数组的语法np.dot。请注意,这仅适用于 2D 数组(即不适用于矩阵向量乘法)。

  >>> np.dot(np.dot(a, a.T), a).dot(a.T)
  array([[1406,  382,  446],
         [ 382,  106,  126],
         [ 446,  126,  152]])
  >>> np.linalg.multi_dot((a, a.T, a, a.T))
  array([[1406,  382,  446],
         [ 382,  106,  126],
         [ 446,  126,  152]])

针对特殊情况的罕见选择

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

>>> np.tensordot(a, b, axes=1)
array([16,  6,  8])
  • numpy.vdot如果您有一个复数矩阵,请不要使用n*m,因为矩阵将被展平为一维数组,然后它将尝试找到展平矩阵和向量之间的复共轭点积(由于与的大小不匹配,这将失败n)。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用