Ruby 平均一个大数组?

Ruby 平均一个大数组?,ruby,arrays,postgresql,average,Ruby,Arrays,Postgresql,Average,我已经从数据库中得到了最终相当于一个大数组的数字 所以,它可能看起来像:[1,3,1,2,1,3,1,2,3,3,1,3,1,3,3,2,3,3,3,3,3,1,1,1,3,2,1] 但它可能是50000个数字,而不是几十个。最低值始终为1,最高值为3 我需要做的是找到某种滚动平均值,这样我就可以在可管理的折线图中显示数据 那么平均每5-10个数据点的数量?只是不确定处理这种事情的最佳方式是什么 注意:不希望获得单一平均值。我希望将整个阵列提取为几个更平均的点。因此,1000个点的数据集可能被分

我已经从数据库中得到了最终相当于一个大数组的数字

所以,它可能看起来像:[1,3,1,2,1,3,1,2,3,3,1,3,1,3,3,2,3,3,3,3,3,1,1,1,3,2,1]

但它可能是50000个数字,而不是几十个。最低值始终为1,最高值为3

我需要做的是找到某种滚动平均值,这样我就可以在可管理的折线图中显示数据

那么平均每5-10个数据点的数量?只是不确定处理这种事情的最佳方式是什么

注意:不希望获得单一平均值。我希望将整个阵列提取为几个更平均的点。因此,1000个点的数据集可能被分解成10个平均数

1.9.3p327 :001 > a = [1,3,1,2,1,3,1,2,3,1,2,3,1,3,1,3,1,1,3,2,3,3,3,3,1,1,1,1,3,2,1]
 => [1, 3, 1, 2, 1, 3, 1, 2, 3, 1, 2, 3, 1, 3, 1, 3, 1, 1, 3, 2, 3, 3, 3, 3, 1, 1, 1, 1, 3, 2, 1]
1.9.3p327 :002 > a.each_cons(10).map { |subarray| subarray.reduce(0.0, :+) / subarray.size }
 => [1.8, 1.9, 1.9, 1.9, 2.0, 2.0, 2.0, 2.0, 1.9, 1.9, 2.0, 2.1, 2.1, 2.3, 2.3, 2.3, 2.1, 2.1, 2.1, 2.1, 2.1, 1.9]
但这在性能方面并不好。它是ONM,其中N是数组的大小,在本例中M是窗口10的大小

UPD:如果需要显著减小阵列大小,也可以使用每个_片:

1.9.3p327 :002 > a.each_slice(10).map { |subarray| subarray.reduce(0.0, :+) / subarray.size }
 => [1.8, 2.0, 2.1, 1.0]

平均数的平均数与总平均数不同。除非您不需要太高的精度,或者不需要平均值的子集,否则我不推荐使用它。

此切片平均值可以通过数据库选择直接获取。您的数据库引擎几乎肯定会比ruby进行分组和平均计算至少快一个数量级,此外,您将通过连接从db传输到程序的数据少得多,并显著减少ruby程序中实例化的表示结果集的对象数

因此,如果您的原始查询在Postgresql中看起来像这样:

从mytable中选择值; 您可以对其进行修改,以生成每十项的平均值,如下所示:

选择avgvalue作为chunk\u avg,第/10行作为chunk 从…起 选择值,行数超过-1作为行 来自mytable x 分组 按块排序;
如果您不想在结果中显示区块编号,您可以将其包装在另一个外部select中,该外部select仅用于投影chunk_avg,或者从select子句中删除chunk字段,并用group by和order by子句中的row/10替换chunk。

作为旁注,在编辑之前的示例中,最高值不是3。但真正的问题是,你的“平均值”应该有多精确?你为什么不直接从数据库中选择平均值?@mcfinnigan我不需要一个平均值……我需要多个平均数据点。因此,一个1000个数字的数据集可能有10个平均点。@shpriford您的数据库可以通过按行号分组来生成切片的平均值。DB在这一点上几乎肯定会比ruby快至少一个数量级。@dbenhur:那么,你想用这个解决方案添加一个答案吗?为了满足OP的要求,所以也许平均每5-10个数据点的数量,每个_cons都应该被每个_片所取代。每个_cons和每个_片所做的有什么区别?每个_片可能就是我要找的……但我很好奇每个_片到底在做什么。每个_片接受每个n个元素,而每个_片向前滑动一个大小为n的窗口,一次一个元素。它不是一个平均值的平均值……它只是将一组数字分解成数据范围内的几个平均值,而不是一个平均值。然后你的想法是在子集中进行黄金平均