列表列表中的平均部分

时间:2015-07-22 08:47:04

标签: python

我有很多列表,比如

import numpy as np
np.array([range(1,1000), range(1,1000), range(1,1000)])

我想计算每列中50个值的平均值。我想得到类似的东西:

np.array([[np.mean(range(1,50)), np.mean(range(51,100)), ...], [[np.mean(range(1,50)), np.mean(range(51,100)), ...], ...])

但是我没有1-1000的值,而是有几个文本文件,每个文件只有一列,我把它们一起打包在np.array中

average_list = np.array([ np.genfromtxt("1.txt"), np.genfromtxt("2.txt") ])

我尝试循环部分列表并一起添加50个值,但它似乎没有做我想要的事情

average_list = np.array([ np.genfromtxt("1.txt"), np.genfromtxt("2.txt") ])
new_list = []
n=100
for i in range(len(average_list)):
    for j in range(len(average_list[i])):
        while n < j < n+50:
            average_list[i,j]+=average_list[i,j+1]
            j+=1
            new_list.append(average_list[i,j])
        print new_list
        n+=50

2 个答案:

答案 0 :(得分:4)

简单易读的解决方案是在外部列表上运行map,并在每个50的空格处对内部循环的索引运行for循环。

这是一个演示:

length = 3
a = np.array([range(1,10), range(1,10)])
map(lambda y: [np.mean(y[i:i+length]) for i in range(0, len(y), length)], a)

上面的代码取每3个元素的平均值 如果使用python2

,您也可以使用xrange

答案 1 :(得分:0)

您可以先reshape数组,以便每行都是50个元素的组中的一个,然后将np.mean应用于每个行,然后重新整形。

>>> a = np.array([range(1000), range(1000), range(1000)])
>>> b = np.reshape(a, (60, 50))
>>> c = np.apply_along_axis(np.mean, 1, b)
>>> np.reshape(c, (3, 20))
array([[  24.5,   74.5,  124.5,  174.5,  224.5,  274.5,  324.5,  374.5,
         424.5,  474.5,  524.5,  574.5,  624.5,  674.5,  724.5,  774.5,
         824.5,  874.5,  924.5,  974.5],
       [  24.5,   74.5,  124.5,  174.5,  224.5,  274.5,  324.5,  374.5,
         424.5,  474.5,  524.5,  574.5,  624.5,  674.5,  724.5,  774.5,
         824.5,  874.5,  924.5,  974.5],
       [  24.5,   74.5,  124.5,  174.5,  224.5,  274.5,  324.5,  374.5,
         424.5,  474.5,  524.5,  574.5,  624.5,  674.5,  724.5,  774.5,
         824.5,  874.5,  924.5,  974.5]])