最简单的解决方案
使用numpy.dot或a.dot(b )。 请参阅此处的文档。
a=NP.array ([ 5,1,3 ],
[ 1,1,1 ],
[ 1,2,1 ] )
b=NP.array ([ 1,2,3 ] ) )。
printa.dot(b )。
array ([ 16,6,8 ] )
这是因为numpy数组按元素在标准操作*、-和/数组上工作,而不是按矩阵工作。 而是尝试使用numpy.matrix,*将其视为矩阵乘法。
其他解决方案
我知道还有其他选择:
如下所述,使用python3.5时,@运算符按预期方式工作。
打印(a @ b ) )。
array ([ 16,6,8 ] )
过度杀伤时,请使用numpy.einsum。 本文档为你提供了它的工作原理,但说实话,直到你读了这个答案并自己动手摆弄它,你还没有充分理解如何使用它。
NP.Einsum(Ji,i-j ),a,b ) )。
array ([ 16,6,8 ] )
从2016年年中(numpy 1.10.1 ) )开始,尝试使用Experimenting numpy.matmul。 numpy.dot的作用与以下两个主要异常相同: 没有标量乘法,但可以在矩阵堆栈中使用。
NP.matmul(a,b ) )。
array ([ 16,6,8 ] )
numpy.inner也以同样的方式工作。 numpy.dot对矩阵-向量乘法表示不同的矩阵基质和kadyl乘法。 (请看关于维基百科之间差异的内积和点积很普遍,或者其SO回答是关于numpy的实现。 )。
NP.inner(a,b ) )。
array ([ 16,6,8 ] )
# bewareusingformatrixmultiplicationthough!
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 ] )
边壳难选
如果存在kadyl (维数大于或等于1的数组),则numpy.tensordot可以将axes=1与可选参数一起使用。
NP.tensordot(a,b,axes=1) )。
array ([ 16,6,8 ] )
如果有numpy.vdot复数矩阵,请不要使用。 矩阵展平为一维数组,试图在展平的矩阵和向量之间找到复杂的共轭点积(由于大小不匹配而失败) (n*mvs n )。