3

有没有更好更快的方法在 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.

4

2 回答 2

8

您可以使用numpy.einsum

ans = einsum('ijk,jk->ij', h, c)
于 2013-04-29T20:34:15.857 回答
6

作为沃伦解决方案的替代方案,我认为这是最好的,有未记录的inner1d

>>> from numpy.core.umath_tests import inner1d
>>> a = inner1d(h, c)
>>> np.allclose(a, ans)
True

从它的文档字符串:

inner1d(x1, x2[, out])

在最后一个维度内部并在其余维度上广播:(i),(i)->()

对于这种特殊情况,在我的系统上,inner1dnp.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
于 2013-04-29T20:41:15.370 回答