3

假设我有一个np.einsum执行一些计算的设备,然后将其直接泵入另一个np.einsum执行其他操作。一般来说,我可以将这两个einsums 组合成一个 seinsum吗?

我的具体用例是我正在做一个转置,一个矩阵乘法,然后是另一个矩阵乘法来计算b a^T a

import numpy as np
from numpy import array

a = array([[1, 2],
       [3, 4]])
b = array([[1, 2],
       [3, 4],
       [5, 6]])

matrix_multiply_by_transpose = 'ij,kj->ik'
matrix_multiply = 'ij,jk->ik'
test_answer = np.einsum(matrix_multiply,
    np.einsum(matrix_multiply_by_transpose, 
        b, a
    ),
    a
)

assert np.array_equal(test_answer, 
    np.einsum(an_answer_to_this_question, b, a, a))
#or, the ultimate most awesomest answer ever, if such a thing even exists
assert np.array_equal(test_answer,
    np.einsum(the_bestest_answer(matrix_multiply_by_transpose, matrix_multiply),
        b, a, a)
)
4

1 回答 1

1

在单次einsum通话中,它将是 -

np.einsum('ij,kj,kl->il',b,a,a)

所涉及的直觉是:

  1. 从最里面的einsum电话开始:'ij,kj->ik'
  2. 搬出去,第二个是:'ij,jk->ik'。其中的第一个参数是来自 的输出step#1。所以,让我们根据第一个参数的输出为第二个参数塑造这个参数,为新的迭代器引入新的字符串:'ik,kl->il'。请注意,这'kl'是第二次einsum调用中的第二个参数,即a.

因此,结合,我们有 :'ij,kj,kl->il'与相同序列中的输入,即b,a用于最里面的einsum调用,然后a作为第三个输入传入。

于 2018-11-06T18:14:17.910 回答