如何在Ruby中从平面数组创建直方图

Whi*_*cat 21 ruby 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]
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)

  • 您可以使用“itself”:“data.group_by(&:itself).transform_values(&:size)”。或者,之前已经说过,从 Ruby 2.7.0 `data.tally` 开始。 (2认同)

Rah*_*sal 8

使用这个宝石 - 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还支持不同的分箱行为和权重/分数.

希望这可以帮助.