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