计算1行代码中向量中每个唯一整数的实例?

时间:2014-01-16 20:19:39

标签: julia

有没有一种灵巧的方法来重写这个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

5 个答案:

答案 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)]

在短暂的测试中,它比你的初始功能(时间和记忆)更好。

警告:结果未排序!