“map”等价于二维列表推导式

4
在一维中,我可以使用以下任何一个:
[i for i in 1:5] 

或者
map(1:5) do i 
    i
end

两者均产生

[1,2,3,4,5]

有没有办法在更高维度中使用 map 函数?例如进行复制操作。
[x + y for x in 1:5,y in 10:13] 

这会产生

5×4 Array{Int64,2}:
 11  12  13  14
 12  13  14  15
 13  14  15  16
 14  15  16  17
 15  16  17  18
2个回答

7
你可以这样做:
julia> map(Iterators.product(1:3, 10:15)) do (x,y)
         x+y
       end
3×6 Array{Int64,2}:
 11  12  13  14  15  16
 12  13  14  15  16  17
 13  14  15  16  17  18

我认为您编写的理解是collect(x+y for (x,y) in Iterators.product(1:5, 10:13))。请注意括号(x,y),因为do函数需要一个元组。与获取两个参数时的x,y不同:

julia> map(1:3, 11:13) do x,y
         x+y
       end
3-element Array{Int64,1}:
 12
 14
 16

看起来你在示例中把范围部分颠倒了。问题的示例使用 x=1:5y=10:13,而你的示例使用 x=1:3y=10:15。这在比较问题和答案的输出时有点令人困惑。 :) - Cameron Bieganek
是的,我改过它们了,事实上改了两次。 - mcabbott
1
@code_lowered (() -> ([x + y for x in 1:5, y in 10:13]))() 对这个答案表示赞同 :) - phipsgabler

5

当然,这并不是您正在寻找的map等效函数,但在像这样的情况下,您可以使用向量和转置向量进行广播:

x = 1:5
y = (10:13)'
x .+ y

在 REPL 中:

julia> (1:5) .+ (10:13)'
5×4 Array{Int64,2}:
 11  12  13  14
 12  13  14  15
 13  14  15  16
 14  15  16  17
 15  16  17  18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接