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

Julia 在一行代码中计算向量中每个唯一整数的实例?,julia,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]; ju

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

我尚未测试性能,但使用hist函数应该可以:

hist(zd,0.5:K+0.5)[2]
给出:

五元素数组{Int64,1}: 1. 4. 1. 0 0

或者,如果零不重要,只需使用

hist(zd)[2]
3-element Array{Int64,1}:
 1
 4
 1

任何替代方案可能都不会更快。您的循环已经只通过数组一次。Julia循环速度很快,矢量化代码没有速度优势,就像其他语言一样

看看Julia对
hist
函数的实现。这是直接从以下文件中获取的:

函数hist(v::AbstractVector,edg::AbstractVector) n=长度(edg)-1 h=零(整数,n) 对于v中的x i=搜索排序的第一个(edg,x)-1 如果1则包装中包含有。您的计数功能相当于计数(zd,1:K)

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

此处


我知道它很旧,但是你呢

[唯一(zd)中i的和(zd.==i)]

在一个简短的测试中,它比您最初的功能(时间和内存方面)表现得更好


注意:结果未排序

这看起来已经很巧妙了。我想我已经想到了一个使用
reduce
fold
之类的单行解决方案,我还对其他方法很好奇,但你是对的,这可能已经足够好了。我喜欢下面使用
hist
的建议。我想我会的。谢谢大家的反馈!仅供参考此处详述的矢量化可能具有速度优势:另请参见此处的@simd:它在某些情况下是实验性的,并警告可能会被删除。但鉴于性能优势,我对此表示怀疑。
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
countmap(x[, wv])
Return a dictionary that maps distinct values in x to their counts (or total weights).