numpy的矩阵乘法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy的矩阵乘法相关的知识,希望对你有一定的参考价值。

用python的numpy做两个矩阵的乘法。
用的是2行2列的矩阵去乘1行2列的矩阵,本来以为可以能得到1行2列的矩阵,
结果显示“ValueError: shapes (2,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)”
网上说行列数不一样的两个矩阵无法进行矩阵乘法计算,请问大神如何解决这个问题。
谢谢

你的问题是否可以转化为对这个式子求导(x+1)/x*2 (x+1)除以x的平方
对分子求导:对存在x的项求导保留x项的倍数,常数求导为0 所以对分子求导结果为1
对分母求导:因为分母为x*2 所以导数为2x (若对x*n x的n次方求导,则为nx*(n-1) n倍的x的n-1次方)
参考技术A 首先 你要明白矩阵乘法的规则shapes(X,Y)的矩阵 只能 与shapes(Y,Z)的矩阵进行乘法,所以2行2列 是无法乘以1行2列的 参考技术B :首先x是自变量。并注意到f(x+1)对x求导为f'(x+1)*1=f'(x+1) 所以在x0处的二级局部泰勒展开式为: Tn(x)=f(x0+1)+f'(x0+1)(x-x0)+(1/2!)f''(x0+1)(x-x0)^2+o(x^2) 注意(x-x0)^n表示n阶无穷小量,所以不能加1

numpy矩阵向量乘法[重复]

【中文标题】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的矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

矩阵乘法性能 numpy 和 eigen c++

numpy 矩阵乘法的奇怪性能结果

Clojure 与 Numpy 中的矩阵乘法

numpy/pandas矩阵乘法的多线程?

[使用Python,NumPy,SciPy使用矩阵乘法对矩阵进行有效切片

numpy中数组(矩阵)的乘法