如何从np.tensordot转到np.einsum

时间:2017-03-23 14:20:10

标签: python numpy-einsum

我在代码中的含义是:

C = np.tensordot(B, A, axes = (0,0))

A是(20L, 50L),B是(20L, 20L)

我应该改变,因为有人告诉我np.einsum会更快,但我想我不完全理解tensordot输出的内容。

现在C是(20L, 50L),我不明白为什么?

当然我已经阅读了文档页面,但仍然没有掌握这些信息。考虑到我刚刚开始使用Python。

1 个答案:

答案 0 :(得分:0)

A形状(20,50),B形状(20,20):

C = np.tensordot(B, A, axes = (0,0))

相当于:

C = np.zeros((20,50))
for i in range(20):
    for j in range(50):
        for k in range(20):
            C[i,j] += A[k,j] * B[k,i]

相当于:

C = np.einsum('kj,ki->ij',A,B)
确实,einsum似乎比tensordot快一点:

%timeit np.einsum('kj,ki->ij',A,B)
10000 loops, best of 3: 20.1 µs per loop

%timeit np.tensordot(B,A,axes=(0,0))
10000 loops, best of 3: 33.6 µs per loop