代码之家  ›  专栏  ›  技术社区  ›  Sockness_Rogers

获取多个数组中给定索引处所有元素的平均值

  •  3
  • Sockness_Rogers  · 技术社区  · 6 年前

    我有大约300个数组,每个数组有100个x和y值的数组。我想得到300个数组的y值的100个平均值的数组。最好的方法是什么?我想我应该使用一些reduce,但我有点迷路了。 以下是我目前掌握的情况:

    let yval = cohort.map((d, i) => {
        let bin = d3.nest()
            .key(function(d) {
                return i;
            })
            .rollup(function(d) {
                return d;
            })
            .entries(d);
    
        return bin;
    });
    
    console.log(yval);
    

    “队列”是一组对象。我想隔离每个队列对象中的“bin”数组。每一个都有117个元素长。对于每个箱子[i],我想从所有箱子中得到[i]的平均值。我想基本上把300个117的数组变成一个117的数组。任何帮助都将不胜感激!

    3 回复  |  直到 6 年前
        1
  •  5
  •   Gerardo Furtado    6 年前

    D3已经有一个名为 d3.mean ,其中:

    返回给定数字数组的平均值

    因此,如果要获得每个内部数组的平均值,只需以下(其中 data 是原始阵列):

    var arrayOfMeans = data.map(d => d3.mean(d));
    

    下面是一个基本演示:

    var data = [
      [1, 2, 3, 4, 5],
      [10, 20, 30, 40, 50],
      [100, 200, 300, 400, 500]
    ];
    
    var arrayOfMeans = data.map(d => d3.mean(d));
    
    console.log(arrayOfMeans)
    <script src="https://d3js.org/d3.v5.min.js"></script>

    然而,您的数据结构目前还不是很清楚:代码段上面的描述( “我有大约300个数组,每个数组有100个x和y值数组” )与代码段下面的描述不同( “‘队列’是一个对象数组。我想在每个队列对象中隔离‘bin’数组。每个队列对象有117个元素长。” )哦!这很令人困惑。。。

    假设有一个数组,每个内部数组有两个值, [x, y] ,这是您可以使用 d3.mean 对于这两种方法,一种是 x 的值和其他 y 值:

    var arrayOfMeans = [d3.mean(data.map(d => d[0])), d3.mean(data.map(d => d[1]))];
    

    或者,如果您不喜欢文字:

    var arrayOfMeans = d3.range(2).map(d => d3.mean(data.map(e => e[d])));
    

    以下是演示:

    var data = [
      [1, 100],
      [2, 200],
      [3, 300]
    ];
    
    var arrayOfMeans = [d3.mean(data.map(d => d[0])), d3.mean(data.map(d => d[1]))]
    
    console.log(arrayOfMeans)
    <脚本src=”https://d3js.org/d3.v5.min.js“></script>
        2
  •  0
  •   J. Kamien    6 年前

    对于如何计算JS中数组的平均值,已经有了答案:

    Finding the average of an array using JS

    您可以使用该答案中定义的函数,并将其映射到数组中。例如:

    var result = cohort.map(cohortElement => cohortElement.bin).map(/*function declared in other StackOverflow answer*/)
    
        3
  •  0
  •   Naga Sai A    6 年前

    为了实现ForEach和array reduce方法的以下选项的预期用途

    1. 首先使用array为300个数组创建循环。ForEach方法

    2. 在每个数组的内部循环中,我使用reduce来查找平均值

    var sampleArr = [];// sample array for testing 
    var meanList = [];// final Mean list array
    for (var i=0; i< 301; i++){
      sampleArr[i] =[]
       for (var j=0; j< 2; j++){
       sampleArr[i].push({
         x:i,
         y:i+1
       })
    }
    }
    
    getMean = arr => {
      arr.forEach(e => {
        let sum = e.reduce(function(a, c) {
          console.log(a, c);
          return a.y + c.y;
        });
        meanList.push(sum / e.length);
      });
    };
    
    getMean(sampleArr)
    
    console.log(meanList);

    我创建了长度为300的样本阵列,每个阵列有2个阵列用于测试

    代码示例- https://codepen.io/nagasai/pen/eMXNMZ?editors=1010