【问题标题】:Vectorising numpy.einsum向量化 numpy.einsum
【发布时间】:2018-05-14 21:54:22
【问题描述】:

我有以下四个张量

  1. H (h, r)
  2. A (a, r)
  3. D (d, r)
  4. T (a, t, r)

对于a 中的每个i,都有一个对应的T[i] 形状为(t, r)

我需要做一个np.einsum 来产生以下结果(pred):

pred = np.einsum('hr, ar, dr, tr ->hadt', H, A, D, T[0])
for i in range(a):
    pred[:, i:i+1, :, :] = np.einsum('hr, ar, dr, tr ->HADT', H, A[i:i+1], D, T[i])

但是,我想在不使用 for 循环的情况下进行此计算。原因是我正在使用 autograd,它目前不适用于项目分配!

【问题讨论】:

    标签: python numpy for-loop vectorization numpy-einsum


    【解决方案1】:

    一种方法是使用 T 的所有维度 -

    np.einsum('Hr, Ar, Dr, ATr ->HADT', H, A, D, T)
    

    因为,我们需要在所有输入中对轴-r 求和,同时在输出中保留所有其他(轴),我看不到任何中间方法/引入任何基于点的工具以此来利用 BLAS。

    【讨论】:

    • 谢谢!我不知何故(错误地)认为在 einsum 字符串中重复相同的字符可能是一种不好的做法。就像,我们在-> 的 LHS 上有两个 As。我认为这个限制适用于->的RHS?
    • @NipunBatra 在 LHS 上重复不同变量意味着保持它们对齐。出于显而易见的原因,不允许重复一个变量或 LHS 或 RHS。
    • 'ii' 是轨迹,'ii->i' 是对角线。 'i,i' 和 'i,i->i' 也可以。在输出中重复 '->ii' 是错误的。
    • @hpaulj 是的,对于相同长度轴的特殊情况。谢谢提醒!
    猜你喜欢
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多