表达众多点积的更好方法是什么?

时间:2013-04-29 20:11:29

标签: python numpy

有没有更好更快的方式在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, :])

我认为应该可以通过simeple重塑,但我不知道如何运行。

2 个答案:

答案 0 :(得分:8)

您可以使用numpy.einsum

ans = einsum('ijk,jk->ij', h, c)

答案 1 :(得分: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