numpymatrix向量乘法

当我乘以尺寸(nxn)*(nx 1)的两个numpy数组时,我得到一个大小为(nxn)的matrix。 遵循正常的matrix乘法规则,预期有(nx 1)个向量,但是我根本无法find关于在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] 

最简单的解决scheme

使用numpy.dota.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数组不是matrix,标准操作*, +, -, /在数组上工作。 相反,你可以尝试使用numpy.matrix*将被视为matrix乘法。


其他解决scheme

也知道还有其他的select:

  • 如下所述,如果使用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 numpy.matmul ,但有两个主要的例外:无标量乘法,但可与matrix堆栈一起工作。

     >>> np.matmul(a, b) array([16, 6, 8]) 

边缘情况下的较差选项

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

     >>> np.tensordot(a, b, axes=1) array([16, 6, 8]) 
  • 如果你有一个复数matrix, 不要使用numpy.vdot ,因为matrix将被压扁成一维数组,然后它将尝试find你的平坦matrix和向量之间的复共轭点乘积(这将失败,因为尺寸不匹配n*m vs n )。