【问题标题】:Matrix generalization of dot product点积的矩阵泛化
【发布时间】:2018-05-25 03:52:04
【问题描述】:

假设我想要一个灵活的函数来计算两个长度为 n 的向量之间的点积,但是为了利用 numpy 中的向量化,我想在 m 这样的对上执行此操作。所以,我想取两个 n x m 矩阵并得到 1 x m 矩阵,其中每个值都是列之间成对内积的结果。

如何使用 Numpy 有机地做到这一点?

【问题讨论】:

  • 你看过numpy.matmul吗?
  • 到目前为止你有什么尝试?
  • matmul 和 dot 的所有变体以及 tensordot 的基本功能都让我失望了。 Matmul 似乎不是解决方案,因为两个 n x m 的矩阵乘法不能以我知道的任何方式产生 1 x m。
  • matmul 可以工作 - 只需将 m 维度移动到前面,(a.T[:,None,:]@b.T[:,:,None]).squeeze()。没有squeeze,结果是(m,1,1)
  • 您介意将此作为答案,以便我选择它吗?

标签: python numpy


【解决方案1】:

np.einsum

np.random.seed([3, 1415])
a = np.random.rand(3, 5)
b = np.random.rand(3, 5)

np.einsum('nm,nm->m', a, b)

array([0.86657218, 1.15263707, 0.49402075, 1.06340726, 0.92129474])

'nm,nm->m' 读取为两个nxm 数组,将它们逐元素相乘并沿长度维度m 求和。或者基本上是你问的。

你可以用更多的数组来概括这一点,并沿任何维度求和

np.random.seed([3, 1415])
a = np.random.rand(3, 5, 10)
b = np.random.rand(3, 5, 10)
c = np.random.rand(3, 5, 10)

np.einsum('lnm,lnm,lnm->l', a, b, c)

array([5.48255315, 5.74368772, 4.21100655])

还有@wim 的回答!

【讨论】:

  • 'n...,n...' 将适用于 1d、2d、3d 等,总是在第一个暗处求和。和@wim 一样普遍
【解决方案2】:

普通数组乘法是逐元素的。所以,你想要的似乎是:

(a1*a2).sum(axis=0)

演示:

>>> a1
array([[0, 1, 2],
       [3, 4, 5]])
>>> a2
array([[5, 4, 3],
       [2, 1, 0]])
>>> (a1*a2).sum(axis=0)
array([6, 8, 6])

我不知道如何让它更“有机”,可以撒上一些龙蒿?

【讨论】:

  • 虽然这是正确的,但如果存在这样的事情,我希望使用单个函数进行多维泛化。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多