使用
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,
*并将其视为矩阵乘法。
其他解决方案
也知道还有其他选择:
如下所述,如果使用python3.5 +,该
@
运算符将按您的预期工作:>>> 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
对矩阵-向量乘法但表现不同 矩阵基质和张量乘法(参见维基百科关于之间的差异的内积和点积在一般或看到该SO答案关于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
vsn
)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)