python中列表列表的移动平均值

时间:2013-09-06 14:48:55

标签: python numpy average

我有一个大型数组,但结构类似于:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

在没有展平数组的情况下,采用5个元素的滚动平均值的最佳,最有效的方法是什么? 即。

值一是(0 + 1 + 2 + 3 + 4)/ 5 = 2

值2将是(1 + 2 + 3 + 4 + 5)/ 5 = 3

值3将是(2 + 3 + 4 + 5 + 6)/ 5 = 4

由于

4 个答案:

答案 0 :(得分:1)

执行此操作的“最佳”方法可能是将数组视图提交到uniform_filter。我不确定这是否会打败你的“无法压扁阵列”,但如果不以某种方式重塑阵列,所有这些方法将比以下方法慢得多:

import numpy as np
import scipy.ndimage.filters as filt

arr=np.array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14],
[15,16,17,18,19]])

avg =  filt.uniform_filter(arr.ravel(), size=5)[2:-2]

print avg
[ 2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17]

print arr.shape  #Original array is not changed.
(4, 5)

答案 1 :(得分:0)

伪代码(虽然它看起来有点像Python):

for i = 0 to 15:
    sum = 0
    for j from 0 to 4:
        // yourLists[m][n] is the nth element of your mth list (zero-indexed)
        sum = sum + yourLists [ (i + j) / 5 ] [ (i + j) % 5 ]
    next j
    print i, sum/5
next i

你最好不要每次都添加所有五个数字。

答案 2 :(得分:0)

注意:此答案 numpy具体。

如果列表列表可以展平,这将更简单。

from itertools import tee

def moving_average(list_of_list, window_size):
    nums = (n for l in list_of_list for n in l)
    it1, it2 = tee(nums)
    window_sum = 0
    for _ in range(window_size):
        window_sum += next(it1)
    yield window_sum / window_size
    for n in it1:
        window_sum += n
        window_sum -= next(it2)
        yield window_sum / window_size

答案 3 :(得分:0)

“最佳”解决方案将取决于为什么您不希望首先展平阵列的原因。如果数据在内存中是连续的,那么使用步幅技巧是计算滚动平均值而不明确展平数组的有效方法:

In [1]: a = np.arange(20).reshape((4, 5))

In [2]: a
Out[2]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In [3]: from numpy.lib.stride_tricks import as_strided

In [4]: s = a.dtype.itemsize

In [5]: aa = as_strided(a, shape=(16,5), strides=(s, s))

In [6]: np.average(aa, axis=1)
Out[6]: 
array([  2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,  11.,  12.,
        13.,  14.,  15.,  16.,  17.])