Count instances of each unique integer in a vector in 1 line of code?
Any alternative probably will not be faster. Your loop already does only one pass through the array. Julia loops are fast, and there is no speed advantage to vectorized code, as there is in other languages.
Have a look at Julia's implementation of the hist
function. This is taken directly from the 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
The "edg" parameter contains the edges of the bins. If we remove that feature, we get exactly the function you wrote.
EDIT hist
has not been available in Julia Base since v0.5.0
There are a bunch of counting functions included in the StatsBase.jl package. Your tally function is equivalent to counts(zd, 1:K)
.
There are also methods for counting unique elements of types other than integer, too, such as countmap
, which returns a dictionary mapping unique values to their number of occurrences.
I haven't tested the performance, but using the hist function should work:
hist(zd,0.5:K+0.5)[2]
gives:
5-element Array{Int64,1}: 1 4 1 0 0
or, if the zeros are unimportant, just use
hist(zd)[2]
3-element Array{Int64,1}:
1
4
1
Here 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).