我在 Julia 用户组上找到了一些讨论,但它们对我来说太技术性了。
我想知道在两者之间进行选择的标准是什么。
我正在关注 JuliaBox 教程,但它没有解释太多。谢谢
小智 9
map并且broadcast在处理不同维度的多个集合时是不同的。虽然broadcast将尝试将所有对象map强制转换为公共维度,但将直接应用给定的函数元素。
julia> map(+, 1, [2,2,2])
1-element Array{Int64,1}:
3
julia> broadcast(+, 1, [2,2,2])
3-element Array{Int64,1}:
3
3
3
Run Code Online (Sandbox Code Playgroud)
广播示例的结果与 相同map(+, [1,1,1], [2,2,2])。
还要注意broadcast在无法找到两个参数之间的公共维度时的行为:
julia> broadcast(+, [1,2,3], [2 2; 2 0])
ERROR: DimensionMismatch("arrays could not be broadcast to a common size")
Stacktrace:
[1] _bcs1 at ./broadcast.jl:439 [inlined]
[2] _bcs at ./broadcast.jl:433 [inlined]
[3] broadcast_shape at ./broadcast.jl:427 [inlined]
[4] combine_axes at ./broadcast.jl:422 [inlined]
[5] instantiate at ./broadcast.jl:266 [inlined]
[6] materialize at ./broadcast.jl:748 [inlined]
[7] broadcast(::typeof(+), ::Array{Int64,1}, ::Array{Int64,2}) at ./broadcast.jl:702
[8] top-level scope at none:0
julia> map(+, [1,2,3], [2 2; 2 0])
3-element Array{Int64,1}:
3
4
Run Code Online (Sandbox Code Playgroud)
小智 5
这两种方法都将函数应用于它们的参数。两者之间的区别在于它们如何处理多维数组。
\nmap首先尝试压缩数组列,创建元组迭代器,将其用作给定函数的参数。因此
julia> map(+, [1,2,3,4], [10, 20, 30, 40])\n4-element Array{Int64,1}:\n 11\n 22\n 33\n 44\nRun Code Online (Sandbox Code Playgroud)\n尽管
\njulia> map(+, [1,2,3,4], [10 20; 30 40])\n4-element Array{Int64,1}:\n 11\n 32\n 23\n 44\nRun Code Online (Sandbox Code Playgroud)\n更改第二个数组的布局时请注意元素配对。另一方面,broadcast对给定函数进行逐元素应用。如果两个数组参数具有相同的维度,则元素配对类似于map。
julia> broadcast(+, [1,2,3,4], [10, 20, 30, 40])\n4-element Array{Int64,1}:\n 11\n 22\n 33\n 44\nRun Code Online (Sandbox Code Playgroud)\n否则,broadcast检查两个数组是否至少在一个维度上匹配,并且至少一个数组的另一维度是否等于 1。如果满足此条件,broadcast复制数组数据,将数组扩展为公共大小1.这就是你得到的
julia> broadcast(+, [1, 2, 3, 4], [10 20 30 40])\n4\xc3\x974 Array{Int64,2}:\n 11 21 31 41\n 12 22 32 42\n 13 23 33 43\n 14 24 34 44\nRun Code Online (Sandbox Code Playgroud)\n