有没有一种灵巧的方法来重写这个Julia函数,可能只使用一行代码,而不会让它慢得多? (我刚开始使用Julia。太棒了!)K
是一个正整数,zd
是一个正整数向量,不大于K
。谢谢!
function tally(zd)
ret = zeros(Int64, K)
for k in zd
ret[k] += 1
end
return ret
end
示例:
julia> K = 5
julia> zd = [1,2,2,2,2,3];
julia> tally(zd)
5-element Array{Float64,1}:
1
4
1
0
0
答案 0 :(得分:8)
任何替代方案可能都不会更快。你的循环已经只通过了一个数组。 Julia循环速度很快,矢量化代码没有速度优势,就像其他语言一样。
查看Julia对hist
函数的实现。这可以直接从Julia Standard Library:
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
“edg”参数包含bin的边缘。如果我们删除该功能,我们就会得到您编写的功能。
答案 1 :(得分:6)
下面 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).
答案 2 :(得分:5)
我没有测试过性能,但使用hist函数应该可以工作:
hist(zd,0.5:K+0.5)[2]
给出:
5元素数组{Int64,1}: 1 4 1 0 0
或者,如果零不重要,只需使用
hist(zd)[2]
3-element Array{Int64,1}:
1
4
1
答案 3 :(得分:3)
a bunch of counting functions包中包含StatsBase.jl。您的计数功能相当于counts(zd, 1:K)
。
还有一些方法可以计算除整数之外的其他类型的元素,例如countmap
,它返回一个字典,将唯一值映射到它们的出现次数。
答案 4 :(得分:2)
我知道它的旧但是怎么样
[sum(zd .== i) for i in unique(zd)]
在短暂的测试中,它比你的初始功能(时间和记忆)更好。
警告:结果未排序!