gpt4 book ai didi

python - Julia:向量化序列的乘积

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:57:30 24 4
gpt4 key购买 nike

学习从 Python 传递到 Julia,我正在尝试转换我拥有的旧代码,即计算此表达式序列的乘积:

enter image description here

我有两个版本的 Python 代码,一个使用 for 循环实现,另一个使用广播。 for 循环版本是:

import numpy as np
A = np.arange(1.,5.,1)
G = np.array([[1.,2.],[3.,4.]])

def calcF(G,A):
N = A.size
print A
print N
F = []
for l in range(N):
F.append(G/A[l])
print F[l]
for j in range(N):
if j != l:
F[l]*=((G - A[l])/(G + A[j]))*((A[l] - A[j])/(A[l] + A[j]))
return F

F= calcF(G,A)
print F

以及我从对我的问题的回答中学到的矢量化版本 here , 这个函数是:

def calcF_vectorized(G,A):
# Get size of A
N = A.size

# Perform "(G - A[l])/(G + A[j]))" in a vectorized manner
p1 = (G - A[:,None,None,None])/(G + A[:,None,None])

# Perform "((A[l] - A[j])/(A[l] + A[j]))" in a vectorized manner
p2 = ((A[:,None] - A)/(A[:,None] + A))

# Elementwise multiplications between the previously calculated parts
p3 = p1*p2[...,None,None]

# Set the escaped portion "j != l" output as "G/A[l]"
p3[np.eye(N,dtype=bool)] = G/A[:,None,None]

Fout = p3.prod(1)

# If you need separate arrays just like in the question, split it
return np.array_split(Fout,N)

我试图天真地将 Python for 循环代码翻译成 Julia:

function JuliacalcF(G,A)
F = Array{Float64}[]
for l in eachindex(A)
push!(F,G/A[l])
println(A[i])
for j in eachindex(A)
if j!=l
F[l]*=((G - A[l])/(G + A[j]))*((A[l] - A[j])/(A[l] + A[j]))
end
end
end
#println(alpha)
return F
end
A = collect(1.0:1.0:5.0)
G = Vector{Float64}[[1.,2.],[3.,4.]]
println(JuliacalcF(G,A))

但是有没有办法像 numpy 广播矢量化版本那样以一种聪明的方式做到这一点?

最佳答案

另外,看看 More-DotsLoop Fusion其中用示例描述了矢量化。

关于python - Julia:向量化序列的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43231649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com