【问题标题】:fast apply_along_axis equivalent in JuliaJulia 中的快速 apply_along_axis 等效项
【发布时间】:2016-02-17 22:23:32
【问题描述】:

在 Julia 中是否有等效于 numpy 的 apply_along_axis()(或 R 的 apply())?我有一个 3D 数组,我想对每对维度 1 和 2 的坐标应用一个自定义函数。结果应该是一个 2D 数组。

显然,我可以执行两个嵌套的 for 循环,遍历第一维和第二维,然后重新整形,但我担心性能。

这个示例产生了我想要的输出(我知道这对sum() 来说有点毫无意义。这里只是一个假人:

test = reshape(collect(1:250), 5, 10, 5)

a=[]

for(i in 1:5)
    for(j in 1:10)
        push!(a,sum(test[i,j,:]))
    end
end

println(reshape(a, 5,10))

对更快的版本有什么建议吗?

干杯

【问题讨论】:

    标签: julia


    【解决方案1】:

    Julia 有 mapslices 函数,它应该完全符合您的要求。但请记住,Julia 与您可能知道的其他语言不同:库函数不一定比您自己的代码快,因为它们的通用性可能比您实际需要的更高,并且在 Julia 中循环很快。所以很有可能只写出循环会更快。

    也就是说,有几个提示:

    • 阅读手册的performance tips 部分。从中您将学会将所有内容放在一个函数中,并且不使用像 a = [] 这样的无类型数组。
    • slicesub 函数可以避免复制数据。

    【讨论】:

    • 谢谢,这正是我想要的。我也意识到循环要快得多:(“性能提示”很好。谢谢!
    【解决方案2】:

    怎么样

    f = sum  # your function here
    Int[f(test[i, j, :]) for i in 1:5, j in 1:10]
    

    最后一行是二维数组推导式。 前面的Int是为了保证元素的类型;如果理解在函数内部,则这不是必需的。

    请注意,您应该(几乎)永远不要使用无类型 (Any) 数组,例如您的 a = [],因为这会很慢。你可以写 a = Int[] 来创建一个空的 Ints 数组。

    编辑:请注意,在 Julia 中,循环很快。在 Python 和 R 中创建类似函数的需求来自于这些语言中循环的固有缓慢性。在 Julia 中,只写出循环更为常见。

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2022-07-29
      相关资源
      最近更新 更多