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

Jef*_*eff 7 julia

是否有一种灵活的方式来重写这个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的边缘.如果我们删除该功能,我们会得到您编写的功能.


Bog*_*kiy 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).
Run Code Online (Sandbox Code Playgroud)


meg*_*art 5

我没有测试过性能,但是使用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)


Mat*_* B. 5

一堆计数功能包含在StatsBase.jl包。您的计数功能相当于counts(zd, 1:K)

还有一些方法可以计算非整数类型的唯一元素,例如countmap,它返回一个字典,将唯一值映射到它们的出现次数。


小智 5

我知道它很旧但是怎么样

[sum(zd .== i) for i in unique(zd)]

在一个简短的测试中,它比你的初始功能表现得更好(时间和内存明智)。

注意:结果未排序!