【问题标题】:How to initialise reduce and use accumulator in Julia如何在 Julia 中初始化 reduce 和使用累加器
【发布时间】:2019-06-12 05:08:33
【问题描述】:

它没有初始值:

reduce(+, [2 3 4])

尝试了多种方法来提供初始值 - 没有任何效果

reduce(+, [2 3 4], 1)
reduce(+, 1, [2 3 4])

reduce 似乎也只能与 2 个参数运算符一起使用。应该使用什么函数来使用接受当前值和累加器的自定义函数来减少收集?类似下面的代码?

reduce((accumulator, value) -> push!(accumulator, value^2), [1, 2, 3], [])
# => [1, 4, 9]

这个例子可以实现为map(x -> x^2, [1, 2, 3]),但我想知道如何用累加器实现reduce。

朱莉娅 1.1.1 版

【问题讨论】:

    标签: julia


    【解决方案1】:

    reduceinit 参数是关键字参数:

    julia> reduce(+, [2 3 4], init = 1)
    10
    
    julia> reduce((accumulator, value) -> push!(accumulator, value^2), [1, 2, 3], init = [])
    3-element Array{Any,1}:
     1
     4
     9
    

    【讨论】:

    • 谢谢。至于累加器 - 你知道是否可以保证它始终是第一个参数,并且列表将从第一个到最后一个顺序减少?
    • 如果你想保证约简的左结合性,你可以使用foldl。明确不保证reduce 的关联性。
    • 请注意,[] 的类型为 Vector{Any},这可能会影响性能。顺便说一句,为什么要推入累加器,而不是使用广播?
    • @DNF,关于累加器,这似乎更像是“可以做到吗?”问题,而不是“应该这样做吗?”问题。 OP 甚至提到他可以使用map 代替给定的示例。
    • 好吧,我通常也喜欢解决“应该完成”,即使发帖人没有要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2013-12-23
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2021-03-27
    相关资源
    最近更新 更多