快速apply_along_axis相当于朱莉娅

时间:2015-11-16 18:07:46

标签: julia

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))

对更快版本的任何建议?

干杯

2 个答案:

答案 0 :(得分:4)

Julia拥有mapslices功能,可以完全按照您的意愿行事。但请记住,Julia与您可能知道的其他语言不同:库函数不一定比您自己的代码更快,因为它们可能被写入比您实际需要的更高的通用性,并且在Julia循环中速度很快。因此,写出循环的可能性会更快。

那说了几个提示:

  • 阅读手册的performance tips部分。从那以后你就会学会把所有东西放在一个函数中,而不是使用像a = []那样的无类型数组。
  • slicesub功能可以避免复制数据。

答案 1 :(得分:1)

怎么样

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

最后一行是二维数组理解。 前面的Int是为了保证元素的类型;如果理解是在函数内部,那么这不应该是必要的。

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

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