有没有更好更快的方法在 numpy 中表达以下点积?我有以下形状:
>>> h.shape
(600L, 400L, 3L)
>>> c.shape
(400L, 3L)
如果可能没有循环,我想计算以下内容:
ans = np.empty((600, 400))
for i in range(400):
ans[:, i] = h[:, i, :].dot(c[i, :])
我认为通过简单的重塑应该是可能的,但我不明白 atm.
您可以使用numpy.einsum
ans = einsum('ijk,jk->ij', h, c)
作为沃伦解决方案的替代方案,我认为这是最好的,有未记录的inner1d
:
>>> from numpy.core.umath_tests import inner1d
>>> a = inner1d(h, c)
>>> np.allclose(a, ans)
True
从它的文档字符串:
inner1d(x1, x2[, out])
在最后一个维度内部并在其余维度上广播:(i),(i)->()
对于这种特殊情况,在我的系统上,inner1d
比np.einsum
:
In [2]: %timeit np.einsum('ijk,jk->ij', h, c)
100 loops, best of 3: 3.85 ms per loop
In [3]: %timeit inner1d(h, c)
100 loops, best of 3: 2.78 ms per loop