numpy.einsum 朱莉娅? (2)
numpy.einsum for Julia? (2)
从这个 question 开始,我想知道是否可以使用更通用的 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)
或类似的东西,我如何在不循环求和的情况下解决这个问题?
谨致问候
Edit/Update: 这现在是一个注册包,所以你可以 Pkg.add("Einsum")
你应该可以开始了(见下面的例子开始了)。
原始答案:我刚刚创建了一些非常初步的代码来执行此操作。它完全遵循 Matt B. 在他的评论中描述的内容。希望对你有帮助,如果有问题请告诉我。
https://github.com/ahwillia/Einsum.jl
这就是您实施示例的方式:
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
查看完整代码):
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
从这个 question 开始,我想知道是否可以使用更通用的 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)
或类似的东西,我如何在不循环求和的情况下解决这个问题?
谨致问候
Edit/Update: 这现在是一个注册包,所以你可以 Pkg.add("Einsum")
你应该可以开始了(见下面的例子开始了)。
原始答案:我刚刚创建了一些非常初步的代码来执行此操作。它完全遵循 Matt B. 在他的评论中描述的内容。希望对你有帮助,如果有问题请告诉我。
https://github.com/ahwillia/Einsum.jl
这就是您实施示例的方式:
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
查看完整代码):
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