我正在创建一个直方图算法。我在下面提供的解决方案here。
我想简单地计算每个值出现的次数。
然而,我不能完全得到正确的算法。我的代码是:
var values = [2, 4, 6, 3, 3];
var val_max = 6;
var val_min = 2;
var num_bins = parseInt(val_max - val_min + 1);
console.log('num_bins is ', num_bins);
var bin_width = (val_max-val_min)/num_bins;
console.log('bin_width is ', bin_width);
var to_plot = [];
for (var i = 0; i < num_bins; i++) {
to_plot.push(0);
}
for (var x = 0; x < values.length; x++) {
var bin_idx = parseInt((values[x] - val_min) / bin_width);
to_plot[bin_idx] = to_plot[bin_idx] + 1;
}
console.log('to_plot is ', to_plot);
如果查看控制台日志,您将看到:
to_plot is [1, 2, 1, 0, 0, NaN]
我希望最后一个索引为“1”。但问题是,对于接近最大值的值,bin_idx
超出范围。我该如何调整它,以获得以下结果?
to_plot is [1, 2, 1, 0, 1]
jsfiddle是here。
4条答案
按热度按时间ghhkc1vu1#
我会这么做
这也适用于非整数值。
agyaoht72#
我觉得你的
bin_width
是错的。尝试以下计算:这就形成了
bin_width == 1
,它可以让你的其余代码工作。2hh7jdfx3#
由于bin的数量等于
val_min
和val_max
之间的整数的数量,因此bin_width
是1,而不是0。8目前正在计算中。你基本上是在计算整数。使用此循环生成直方图:uajslkp64#
对于那些对直方图输出感兴趣而不是对实现感兴趣的人,d3-array库提供了一个
bin()
方法,用于构建直方图。下面是在
bin()
之上的一个用Typescript编写的精简 Package 器,它添加了一些特性并提供了类似于Python's numpy.histogram的输出。