有没有更好更快的方式在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重塑,但我不知道如何运行。
答案 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) - >()
对于这种特殊情况,在我的系统上,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