1
學習序列的產品,從Python的傳遞到朱莉婭,我想轉換的舊代碼,我有,就是計算這個表達的序列的產品:朱莉婭:以量化的方式
我在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
循環代碼朱莉婭:
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
g矢量化版本?
你確定你需要一個矢量化的版本嗎?如果你對性能感興趣(和_probably_ vectorizing),我會先推薦你[profile](http://docs.julialang.org/en/stable/stdlib/profile/)你的代碼,並看看[performance提示](http://docs.julialang.org/en/stable/manual/performance-tips/) –