是否有一种灵活的方式来重写这个Julia函数,可能只使用一行代码,而不是让它慢得多?(我刚刚开始使用Julia.这很棒!)K是一个正整数,zd是一个正整数的向量,不大于K.谢谢!
function tally(zd)
ret = zeros(Int64, K)
for k in zd
ret[k] += 1
end
return ret
end
Run Code Online (Sandbox Code Playgroud)
例:
julia> K = 5
julia> zd = [1,2,2,2,2,3];
julia> tally(zd)
5-element Array{Float64,1}:
1
4
1
0
0
Run Code Online (Sandbox Code Playgroud)
小智 7
任何替代方案可能都不会更快.你的循环已经只通过了一个数组.Julia循环速度很快,矢量化代码没有速度优势,就像其他语言一样.
看看Julia的hist功能实现.这是直接从Julia标准库中获取的:
function hist(v::AbstractVector, edg::AbstractVector)
n = length(edg)-1
h = zeros(Int, n)
for x in v
i = searchsortedfirst(edg, x)-1
if 1 <= i <= n
h[i] += 1
end
end
edg,h
end
Run Code Online (Sandbox Code Playgroud)
"edg"参数包含bin的边缘.如果我们删除该功能,我们会得到您编写的功能.
这里是 http://statsbasejl.readthedocs.org/en/latest/counts.html#countmap
countmap(x[, wv])
Return a dictionary that maps distinct values in x to their counts (or total weights).
Run Code Online (Sandbox Code Playgroud)
我没有测试过性能,但是使用hist函数应该可以工作:
hist(zd,0.5:K+0.5)[2]
Run Code Online (Sandbox Code Playgroud)
得到:
5元素阵列{Int64,1}:1 4 1 0 0
或者,如果零不重要,只需使用
hist(zd)[2]
3-element Array{Int64,1}:
1
4
1
Run Code Online (Sandbox Code Playgroud)
有一堆计数功能包含在StatsBase.jl包。您的计数功能相当于counts(zd, 1:K)。
还有一些方法可以计算非整数类型的唯一元素,例如countmap,它返回一个字典,将唯一值映射到它们的出现次数。