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.dot
或a.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*m
与n
的大小不匹配而失败)。
【讨论】:
IMP 注意:为了支持数组,应避免使用 numpy 矩阵。文档中的注释->“不再建议使用此类,即使对于线性代数也是如此。而是使用常规数组。将来可能会删除该类。”另请参阅 ***.com/a/61156350/6043669 优秀答案 wflynny以上是关于numpy矩阵向量乘法[重复]的主要内容,如果未能解决你的问题,请参考以下文章