朱莉娅:地图和广播有什么区别?

Pig*_*gna 10 julia

我在 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

这两种方法都将函数应用于它们的参数。两者之间的区别在于它们如何处理多维数组。

\n

map首先尝试压缩数组列,创建元组迭代器,将其用作给定函数的参数。因此

\n
julia> map(+, [1,2,3,4], [10, 20, 30, 40])\n4-element Array{Int64,1}:\n 11\n 22\n 33\n 44\n
Run Code Online (Sandbox Code Playgroud)\n

尽管

\n
julia> map(+, [1,2,3,4], [10 20; 30 40])\n4-element Array{Int64,1}:\n 11\n 32\n 23\n 44\n
Run Code Online (Sandbox Code Playgroud)\n

更改第二个数组的布局时请注意元素配对。另一方面,broadcast对给定函数进行逐元素应用。如果两个数组参数具有相同的维度,则元素配对类似于map

\n
julia> broadcast(+, [1,2,3,4], [10, 20, 30, 40])\n4-element Array{Int64,1}:\n 11\n 22\n 33\n 44\n
Run Code Online (Sandbox Code Playgroud)\n

否则,broadcast检查两个数组是否至少在一个维度上匹配,并且至少一个数组的另一维度是否等于 1。如果满足此条件,broadcast复制数组数据,将数组扩展为公共大小1.这就是你得到的

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n