如何创建整数数组的直方图?例如:
data = [0,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,5,5,6,6,6,7,7,7,7,7,8,9,9,10]
Run Code Online (Sandbox Code Playgroud)
我想基于有多少项有用于创建直方图0
,1
,2
,等等.在Ruby中有一个简单的方法吗?
输出应该是两个数组.第一个数组应包含组(bin),第二个数组应包含出现次数(频率).
对于data
上面给出的,我希望以下输出:
bins # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
frequencies # => [1, 1, 5, 6, 4, 2, 3, 5, 1, 2, 1]
Run Code Online (Sandbox Code Playgroud)
the*_*Man 47
Ruby的Array继承group_by
自Enumerable,它做得很好:
Hash[*data.group_by{ |v| v }.flat_map{ |k, v| [k, v.size] }]
Run Code Online (Sandbox Code Playgroud)
哪个回报:
{
0 => 1,
1 => 1,
2 => 5,
3 => 6,
4 => 4,
5 => 2,
6 => 3,
7 => 5,
8 => 1,
9 => 2,
10 => 1
}
Run Code Online (Sandbox Code Playgroud)
这只是一个很好的'干净哈希.如果你想要一个每个bin和频率对的数组,你可以缩短它并使用:
data = [0,1,2,2,3,3,3,4]
data.group_by{ |v| v }.map{ |k, v| [k, v.size] }
# => [[0, 1], [1, 1], [2, 2], [3, 3], [4, 1]]
Run Code Online (Sandbox Code Playgroud)
以下group_by
是使用较小数据集的代码和正在执行的操作:
data.group_by{ |v| v }
# => {0=>[0], 1=>[1], 2=>[2, 2], 3=>[3, 3, 3], 4=>[4]}
data.group_by{ |v| v }.flat_map{ |k, v| [k, v.size] }
# => [0, 1, 1, 1, 2, 2, 3, 3, 4, 1]
Run Code Online (Sandbox Code Playgroud)
使用这个宝石 - http://rubygems.org/gems/histogram
data = [0,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,5,5,6,6,6,7,7,7,7,7,8,9,9,10]
(bins, freqs) = data.histogram
Run Code Online (Sandbox Code Playgroud)
这将创建一个bins
包含直方图区间和freqs
包含频率的数组的数组.gem还支持不同的分箱行为和权重/分数.
希望这可以帮助.
归档时间: |
|
查看次数: |
11463 次 |
最近记录: |