在JS中为直方图计算类似值的最佳方法是什么?

时间:2015-02-08 13:24:13

标签: javascript arrays performance for-loop

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

假设创建了以下数组:

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/

1 个答案:

答案 0 :(得分:0)

计算频率的关键是将数组的元素加起来:

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

中提供了具有简单直方图的完整样本