首页 > 解决方案 > 在 Numpy 中编写向量矩阵乘积的紧凑而自然的方法

问题描述

在科学计算中,我经常想做向量乘法,比如

一个x b ^T

其中ab是行向量,b ^T 是向量的转置。因此,如果ab的形状为 [n, 1] 和 [m, 1],则生成的矩阵的形状为 [n, m]

在 numpy 中写这个乘法是否有一个好的和直接的方法?

例子:

a = np.array([1,2,3])
b = np.array([4,5,6,7])

手动添加轴工作:

a[:,np.newaxis] @ b[np.newaxis,:]

并给出正确的结果:

[[ 4  5  6  7]
 [ 8 10 12 14]
 [12 15 18 21]]

爱因斯坦符号将是另一种方式,但仍然有些奇怪。

np.einsum('a,b->ab', a,b)

我希望工作但不起作用的内容如下:

a @ b.T

还有其他方法可以做到这一点吗?

标签: numpyvectormatrix-multiplication

解决方案


在评论中,提出了多种解决方案,我在这里总结一下:

  • np.outer(a,b),它基本上将这个乘数重新表述为一个集合问题(感谢Brenlla
  • a[:,np.newaxis]*b(感谢迪瓦卡
  • a.reshape((-1,1)) @ b.reshape((-1,1)).T或者也一样
    a.reshape((-1,1)) @ b.reshape((1,-1))。它有点长,但表明这些 numpy 矩阵运算实际上需要矩阵作为输入,而不仅仅是向量(感谢Warren Weckesserheltonbiker

为了完整起见,我之前已经工作的示例:

  • a[:,np.newaxis] @ b[np.newaxis,:]
  • np.einsum('a,b->ab', a,b)

备注:为了进一步减少字符数,可以使用None代替np.newaxis.


推荐阅读