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.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数组不是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
vsn
)。