我想使用Julia的map
函数来模仿嵌套列表理解。这种能力对于并行映射(pmap
)特别有用。
例如,这个嵌套列表理解
[x+y for x in [0,10] for y in [1,2,3]]
产生了不错的结果
6-element Array{Int64,1}:
1
2
3
11
12
13
和这个
[x+y for x in [0,10], y in [1,2,3]]
产生同样好的
2×3 Array{Int64,2}:
1 2 3
11 12 13
这些结果中的任何一个都符合我的目的。
现在,我尽力用map
map([0,10]) do x
map([1,2,3]) do y
x + y
end
end
产生正确的结果,而不是我所赞赏的形式:
2-element Array{Array{Int64,1},1}:
[1, 2, 3]
[11, 12, 13]
现在我知道有蛮力的方法可以得到我想要的结果,例如hcat
/ vcat
输出或操纵输入到矩阵,但我想知道如果存在一个像嵌套列表理解一样优雅的解决方案。
答案 0 :(得分:4)
我能想到的最简单的方法是使用理解并将它们与map
(低利益)或pmap
结合起来(这里你得到真正的价值)。
On Julia 0.7(使用在此版本中您在函数参数功能中进行解构的事实):
julia> map(((x,y) for x in [0,10] for y in [1,2,3])) do (x,y)
x+y
end
6-element Array{Int64,1}:
1
2
3
11
12
13
julia> map(((x,y) for x in [0,10], y in [1,2,3])) do (x,y)
x+y
end
2×3 Array{Int64,2}:
1 2 3
11 12 13
On Julia 0.6.2(不太好):
julia> map(((x,y) for x in [0,10] for y in [1,2,3])) do v
v[1]+v[2]
end
6-element Array{Int64,1}:
1
2
3
11
12
13
julia> map(((x,y) for x in [0,10], y in [1,2,3])) do v
v[1]+v[2]
end
2×3 Array{Int64,2}:
1 2 3
11 12 13
答案 1 :(得分:0)
您可以使用Iterators.product
:
julia> map(t -> t[1]+t[2], Iterators.product([0,10], [1,2,3]))
2×3 Array{Int64,2}:
1 2 3
11 12 13
Iterators.product
返回一个元素为元组的迭代器。
(遗憾的是上面的匿名函数无法写成(x,y) -> x+y
)