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

时间:2018-10-19 12:51:44

标签: julia

我在Julia Users组中找到了一些讨论,但对我来说太技术化了。

我想知道在这两者之间进行选择的标准是什么。

我正在关注JuliaBox教程,但解释不多。谢谢

2 个答案:

答案 0 :(得分:1)

mapbroadcast在处理多个不同维度的集合时是不同的。尽管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

广播示例的结果与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

答案 1 :(得分:1)

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

map首先尝试对数组列进行压缩,创建一个元组的迭代器,该迭代器用作给定函数的参数。因此

julia> map(+, [1,2,3,4], [10, 20, 30, 40])
4-element Array{Int64,1}:
 11
 22
 33
 44

同时

julia> map(+, [1,2,3,4], [10 20; 30 40])
4-element Array{Int64,1}:
 11
 32
 23
 44

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

julia> broadcast(+, [1,2,3,4], [10, 20, 30, 40])
4-element Array{Int64,1}:
 11
 22
 33
 44

否则,broadcast检查两个数组是否在至少一个维度上匹配,并且至少一个数组的另一个维度等于1。如果满足此条件,则broadcast扩展数组通过沿等于1的维度复制数组数据将其更改为通用大小。这是您获得的方式

julia> broadcast(+, [1, 2, 3, 4], [10 20 30 40])
4×4 Array{Int64,2}:
 11  21  31  41
 12  22  32  42
 13  23  33  43
 14  24  34  44