什么是通过列或行操作的惯用Julia样式?

Ste*_*son 24 r julia

抱歉,如果这相当普遍 - 虽然仍然是一个编码问题.

有一点时间在我的手上,我一直在努力学习一点Julia.我认为一个好的开始是复制R microbenchmark功能 - 所以我可以无缝地比较R和Julia功能.

例如,这是microbenchmark我试图模拟的2个R函数的输出:

Unit: seconds
expr                    min        lq    median        uq        max      neval
vectorised(x, y)    0.2058464 0.2165744 0.2610062 0.2612965  0.2805144     5
devectorised(x, y)  9.7923054 9.8095265 9.8097871 9.8606076 10.0144012     5
Run Code Online (Sandbox Code Playgroud)

所以到目前为止,在朱莉娅,我正在尝试编写惯用语和希望可理解/简洁的代码.因此,我用列表推导替换了一个双循环来创建一个时序数组,如下所示:

function timer(fs::Vector{Function}, reps::Integer)
#    funs=length(fs)
#    times = Array(Float64, reps, funs)
#    for funsitr in 1:funs
#        for repsitr in 1:reps
#            times[reps, funs] = @elapsed fs[funs]()
#        end
#    end

    times= [@elapsed fs[funs]() for   x=1:reps, funs=1:length(fs)]
    return times
end
Run Code Online (Sandbox Code Playgroud)

这为2个函数中的每一个提供了一系列时序:

julia> test=timer([vec, devec], 10)
10x2 Array{Float64,2}:
 0.231621  0.173984
 0.237173  0.210059
 0.26722   0.174007
 0.265869  0.208332
 0.266447  0.174051
 0.266637  0.208457
 0.267824  0.174044
 0.26576   0.208687
 0.267089  0.174014
 0.266926  0.208741
Run Code Online (Sandbox Code Playgroud)

我的问题(最终)是我怎么惯用应用功能,如min,max,median跨列(或行)的阵列,而不使用循环?

我当然可以轻松地为这个简单的情况做一个循环(我在上面划掉的sim) - 但我在文档中找不到相当于说apply(array,1, fun)或甚至的任何东西colMeans.

我能想到的最接近的通用功能是

julia> [mean(test[:,col]) for col=1:size(test)[2]]
2-element Array{Any,1}:
 0.231621
 0.237173
Run Code Online (Sandbox Code Playgroud)

..但语法确实没有吸引力.apply在Julia中,是否有更自然的方式跨多维数组的列或行进行操作?

Joh*_*ite 13

你想要的功能是mapslices.


iva*_*rne 11

匿名函数 目前在朱莉娅慢,所以我不会用他们为标杆,除非你基准匿名函数.这将为在代码的性能关键部分中不使用匿名函数的代码提供错误的性能预测.

我想你想要减少函数的两个参数版本,比如sum(arr,1)来总结第一个维度.如果没有可用的库函数,则可以使用reducedim