Numpy 给茱莉亚的礼物?(2)

Numpy 给茱莉亚的礼物?(2),numpy,julia,numpy-einsum,Numpy,Julia,Numpy Einsum,由此看来,我想知道是否可能有一个更广义的einsum。让我们假设,我有这个问题 using PyCall @pyimport numpy as np a = rand(10,10,10) b = rand(10,10) c = rand(10,10,10) Q = np.einsum("imk,ml,lkj->ij", a,b,c) 或者类似的问题,我如何解决这个问题而不循环求和 向您致意编辑/更新:这现在是一个已注册的软件包,因此您可以Pkg.add(“Einsum”),您应该可以

由此看来,我想知道是否可能有一个更广义的einsum。让我们假设,我有这个问题

using PyCall
@pyimport numpy as np

a = rand(10,10,10)
b = rand(10,10)
c = rand(10,10,10)

Q = np.einsum("imk,ml,lkj->ij", a,b,c)
或者类似的问题,我如何解决这个问题而不循环求和


向您致意

编辑/更新:这现在是一个已注册的软件包,因此您可以
Pkg.add(“Einsum”)
,您应该可以开始了(请参见下面的示例)

原始答案:我刚刚创建了一些非常初步的代码来实现这一点。这正是马特B.在评论中描述的。希望有帮助,如果有问题请告诉我

以下是您将如何实现示例:

using Einsum

a = rand(10,10,10)
b = rand(10,10)
c = rand(10,10,10)
Q = zeros(10,10)

@einsum Q[i,j] = a[i,m,k]*b[m,l]*c[l,k,j]
在后台,宏构建以下一系列嵌套for循环,并在编译前将它们插入到代码中。(注意,这不是插入的确切代码,它还会检查以确保输入的尺寸一致,使用
macroexpand
查看完整代码):


也许我能帮上忙。请注意,它看起来被放弃了(最新提交日期为2015年3月,当前构建失败),您从等式中删除了
c
python
实现在很大程度上依赖于
nditer
迭代器。请注意,
einsum
可能没有直接移植到Julia,因为自己编写循环同样快。如果我要编写它的一个端口,我可能会在解析时作为一个宏来解码下标字符串,并直接扩展到一组for循环(类似于
@printf
的工作方式)。@varantir如果这回答了您的问题,请将其标记为已回答。谢谢这似乎将求和作为宏而不是函数来实现。我是朱莉娅的新手;如何使用它在表达式中创建具有爱因斯坦求和语法的新数组。例如,一个人如何用它来表达他在numpy中可能写的内容?
for j = 1:size(Q,2)
    for i = 1:size(Q,1)
        s = 0
        for l = 1:size(b,2)
            for k = 1:size(a,3)
                for m = 1:size(a,2)
                    s += a[i,m,k] * b[m,l] * c[l,k,j]
                end
            end
        end
        Q[i,j] = s
    end
end