Julia 在一行代码中计算向量中每个唯一整数的实例?
有没有一种巧妙的方法可以重写这个Julia函数,也许只需要一行代码,而不会让它慢很多?(我刚开始使用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
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).