Averages/Mode: Difference between revisions
(octave (with extensive comments for the "solution" used)) |
m (Python) |
||
Line 43: | Line 43: | ||
mode2(a) % returns 1 and 4 |
mode2(a) % returns 1 and 4 |
||
mode(a) % returns 1 only</lang> |
mode(a) % returns 1 only</lang> |
||
=={{header|Python}}== |
|||
<lang python>>>> from collections import defaultdict |
|||
>>> def modes(values): |
|||
count = defaultdict(int) |
|||
for v in values: |
|||
count[v] +=1 |
|||
best = max(count.itervalues()) |
|||
return [k for k,v in count.iteritems() if v == best] |
|||
>>> modes([1,3,6,6,6,6,7,7,12,12,17]) |
|||
[6] |
|||
>>> modes((1,1,2,4,4)) |
|||
[1, 4]</lang> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |
Revision as of 18:35, 13 June 2009
You are encouraged to solve this task according to the task description, using any language you may know.
Write a program to find the mode value of a vector of integers. The case where the vector is empty may be ignored. Care must be taken to handle the case where the mode is non-unique.
Octave
Of course Octave has the mode function; but it returns only the "lowest" mode if multiple modes are available.
<lang octave>function m = mode2(v)
sv = sort(v); % build two vectors, vals and c, so that % c(i) holds how many times vals(i) appears i = 1; c = []; vals = []; while (i <= numel(v) ) tc = sum(sv==sv(i)); % it would be faster to count % them "by hand", since sv is sorted... c = [c, tc]; vals = [vals, sv(i)]; i += tc; endwhile % stack vals and c building a 2-rows matrix x x = cat(1,vals,c); % sort the second row (frequencies) into t (most frequent % first) and take the "original indices" i ... [t, i] = sort(x(2,:), "descend"); % ... so that we can use them to sort columns according % to frequencies nv = x(1,i); % at last, collect into m (the result) all the values % having the same bigger frequency r = t(1); i = 1; m = []; while ( t(i) == r ) m = [m, nv(i)]; i++; endwhile
endfunction</lang>
<lang octave>a = [1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17]; mode2(a) mode(a)
a = [1, 1, 2, 4, 4]; mode2(a) % returns 1 and 4 mode(a) % returns 1 only</lang>
Python
<lang python>>>> from collections import defaultdict >>> def modes(values): count = defaultdict(int) for v in values: count[v] +=1 best = max(count.itervalues()) return [k for k,v in count.iteritems() if v == best]
>>> modes([1,3,6,6,6,6,7,7,12,12,17]) [6] >>> modes((1,1,2,4,4)) [1, 4]</lang>
Tcl
<lang tcl># Can find the modal value of any vector of values proc mode {n args} {
foreach n [list $n {*}$args] { dict incr counter $n } set counts [lsort -stride 2 -index 1 -decreasing $counter] set best {} foreach {n count} $counts { if {[lindex $counts 1] == $count} { lappend best $n } else break } return $best
}
- Testing
puts [mode 1 3 6 6 6 6 7 7 12 12 17]; # --> 6 puts [mode 1 1 2 4 4]; # --> 1 4</lang>