【问题标题】:What is the best way to count like-values in JS for a Histogram?在 JS 中为直方图计算相似值的最佳方法是什么?
【发布时间】:2015-02-08 13:24:13
【问题描述】:

我正在尝试创建随机生成数据的直方图,所以目前我正在执行以下操作:

假设创建了以下数组:

returns = [0.0024, 0.0231, 0.014, 0.0005, -0.008]

我使用以下方法遍历数组:

 returnsRounded[x] = Math.round(returns[x] * 1000) / 1000;

这将返回我:

returnsRounded = [0.002, 0.023, 0.014, 0.001, -0.008]

现在我正在尝试计算每个特定值的数量(在数万个值的数组中,所以我会非常低效地做类似的事情:

switch (returnsRounded) {
    case -0.040:
        arr[1]++;
        break;
    case -0.038:
        arr[2]++;
        break;
    // ... and so on.
}

然后将计数值插入我的直方图(其工作方式类似于条形图 - 从某种意义上说,它只比较计数。我不能只插入一个数组并获得直方图。

那么有没有比我正在做的更快或更漂亮的方法来计算数组中四舍五入的出现次数?

谢谢!

编辑:我想出了一个比我现在更好的方法,虽然我不知道它是否仍然很棒。这是一个小提琴:

http://jsfiddle.net/brockwhittaker/bLu4s8sc/

【问题讨论】:

  • 只使用一个带键的对象而不是几十个变量和案例?!
  • 请展示如何将计数值插入直方图中。如果 API 是合理的,它应该会提示您如何操作。
  • 我正在使用自定义画布。我可以这样插入值的频率:[1,2,3,6,9,15,18,19,20,19,16,12,10,8,5,4,3,2,2,2 ,1,1]
  • 那么“我不能只插入一个数组”是什么意思?这似乎一个频率数组。
  • 我需要得到频率。这就是这个问题的意义——如何得到一个数字的频率。

标签: javascript arrays performance for-loop


【解决方案1】:

计算频率的关键是对数组的元素进行分箱:

function frequencies(values, binsize) {
    var mapped = values.map(function(val) { 
       return Math.ceil(val / binsize) -1; 
    });
    return mapped.reduce(function (freqs, val, i) {
      var bin = (binsize * val);
      freqs[bin] ? freqs[bin]++ : freqs[bin] = 1;
      return freqs;
    }, {});
}

函数frequencies 创建一个字典(对象),其中每个键/值对都是bin/count,例如:

Object { 0: 60, 1: 43, 2: 11, -0.2: 68, -2: 11, -2.2: 10, -2.4000000000000004: 4, -2.6: 5, -2.8000000000000003: 1, -3: 1, 18 more… }

jsfiddle 中提供了带有简单直方图的完整示例

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2020-09-26
    • 2015-08-21
    相关资源
    最近更新 更多