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))
对更快版本的任何建议?
干杯
答案 0 :(得分:4)
Julia拥有mapslices
功能,可以完全按照您的意愿行事。但请记住,Julia与您可能知道的其他语言不同:库函数不一定比您自己的代码更快,因为它们可能被写入比您实际需要的更高的通用性,并且在Julia循环中速度很快。因此,写出循环的可能性会更快。
那说了几个提示:
a = []
那样的无类型数组。slice
或sub
功能可以避免复制数据。答案 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中创建类似函数的需求来自于这些语言中循环的固有缓慢。在朱莉娅,写出循环更为常见。