arrays - 将函数应用于 Julia 中的列对

标签 arrays loops functional-programming julia

我有一对相同维度的矩阵,例如 Ws, Xs 和一个函数 myFunc(w, x),它接受两个向量作为输入。我想将此函数应用于成对的列(将其视为zip-ing 列)并将此函数映射到它们。

有没有一种非迭代的方法可以做到这一点?如果每个 Ws、Xs只有两列,我可以这样做

allCols = permutedims(reshape(hcat(Ws, Xs), d, 2), [1, 3, 2])
mapslices(x -> myFunc(x[:, 1], x[:, 2]), allCols, dims=[1, 2])

但我无法移动到任意数量的列。

编辑:使用vcat和正确的尺寸似乎可以解决此问题:

# assume d is column size
wxArray = reshape(vcat(Ws, Xs), 2, d)  # group pairs of columns together
mapslices(x -> myFunc(x[:, 1], x[:, 2]), wxArray, dims=[1,2])

最佳答案

您可以像这样使用 eachcol 函数(我给出三种方法只是为了展示不同的可能方法,但 eachcol 在所有方法中都至关重要):

julia> Ws = rand(2,3)
2×3 Array{Float64,2}:
 0.164036  0.233236  0.937968
 0.724233  0.102248  0.55047

julia> Xs = rand(2,3)
2×3 Array{Float64,2}:
 0.0493071  0.735849  0.643352
 0.909295   0.276808  0.396145

julia> using LinearAlgebra

julia> dot.(eachcol(Ws), eachcol(Xs))
3-element Array{Float64,1}:
 0.6666296397421881
 0.19992972241709792
 0.8215096642236619

julia> dot.(eachcol.((Ws, Xs))...)
3-element Array{Float64,1}:
 0.6666296397421881
 0.19992972241709792
 0.8215096642236619

julia> map(dot, eachcol(Ws), eachcol(Xs))
3-element Array{Float64,1}:
 0.6666296397421881
 0.19992972241709792
 0.8215096642236619

这需要 Julia 1.1。

编辑

如果您使用的是 Julia 1.0 并且确实希望避免迭代而不介意一些额外的分配(上面的解决方案避免了分配),您还可以使用 cat 函数(这比您的方法简单一点)我认为):

julia> Ws = rand(2,3)
2×3 Array{Float64,2}:
 0.975749  0.660932  0.391192
 0.619872  0.278402  0.799096

julia> Xs = rand(2,3)
2×3 Array{Float64,2}:
 0.0326003  0.272455  0.713046
 0.389058   0.886105  0.950822

julia> mapslices(x -> (x[:,1], x[:,2]), cat(Ws, Xs; dims=3), dims=[1,3])[1,:,1]
3-element Array{Tuple{Array{Float64,1},Array{Float64,1}},1}:
 ([0.975749, 0.619872], [0.0326003, 0.389058])
 ([0.660932, 0.278402], [0.272455, 0.886105])
 ([0.391192, 0.799096], [0.713046, 0.950822])

当然你也可以简单地这样做:

julia> map(i -> (Ws[:,i], Xs[:,i]), axes(Ws, 2))
3-element Array{Tuple{Array{Float64,1},Array{Float64,1}},1}:
 ([0.975749, 0.619872], [0.0326003, 0.389058])
 ([0.660932, 0.278402], [0.272455, 0.886105])
 ([0.391192, 0.799096], [0.713046, 0.950822])

或更奇特的:

julia> (i -> (Ws[:,i], Xs[:,i])).(axes(Ws, 2))
3-element Array{Tuple{Array{Float64,1},Array{Float64,1}},1}:
 ([0.975749, 0.619872], [0.0326003, 0.389058])
 ([0.660932, 0.278402], [0.272455, 0.886105])
 ([0.391192, 0.799096], [0.713046, 0.950822])

关于arrays - 将函数应用于 Julia 中的列对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094381/

相关文章:

arrays - 从数组中删除最后一个元素

python - 在Python中迭代嵌套列表

javascript - 用另一个对象的细节填充对象

java - 井字游戏的 isEmpty 方法

functional-programming - 如果没有可变状态,你怎么能做任何有用的事情?

Java 11 编译器无法识别 main 方法中的静态 BiFunction

JavaScript:这可能吗?使用数组值显示数量

Javascript:如何获取 function.apply() 的 key

arrays - Swift 字典中的数组

python - 从字典中创建另一个字典