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]
虽然这在性能方面并不好。它是O(NM),其中N是数组的大小,M是窗口的大小(在这种情况下为10)。
UPD:或者你可以使用each_slice
,如果你需要“减少”数组大小显著:
1.9.3p327 :002 > a.each_slice(10).map { |subarray| subarray.reduce(0.0, :+)/subarray.size }
=> [1.8, 2.0, 2.1, 1.0]
作为一个旁注,你的例子中的最高值(编辑前)不是3.)但真正的问题是,你的'平均值'应该有多精确? – raina77ow 2013-03-20 13:39:58
是否有一个原因,你不只是直接从数据库中选择平均值? – mcfinnigan 2013-03-20 13:40:02
@mcfinnigan我不需要一个单一的平均值...我需要多个平均数据点。所以一个1000个数字的数据集可能有10个平均点。 – Shpigford 2013-03-20 13:41:48