获得数组平均值的更多pythonian方法

时间:2015-04-30 08:58:52

标签: python arrays loops mean

我仍然在调整编写代码的“更多pythonian方式”时遇到麻烦...现在我正在迭代一些值(x)。我有很多数组,我总是比较所有数组的第一个值,第二个值......很快:数组中所有条目的平均值按数组中的位置。

   sum_mean_x = []
   for i in range(0, int_points):
       for j in range(0, len(x)):
           mean_x.append(x[j][i])
       sum_mean_x.append(sum(mean_x)/len(x))
       mean_x = []

我很确定可以做得超级漂亮。我知道我可以将第二行改为sum_mean_x.append(mean_x.mean),但我想我会错过一些严肃的魔法。

4 个答案:

答案 0 :(得分:6)

使用numpy包进行数字处理。假设您在普通Python中有以下三个列表:

a1 = [1., 4., 6.]
a2 = [3., 7., 3.]
a3 = [2., 0., -1.]

并且您希望获得每个职位的平均值。将向量排列在一个数组中:

import numpy as np
a = np.array([a1, a2, a3])

然后你可以像这样得到每列的意思:

>>> a.mean(axis=0)
array([ 2.        ,  3.66666667,  2.66666667])

答案 1 :(得分:3)

听起来你要做的就是将列表列表视为一个二维数组,其中每个列表都是一行,然后对每列进行平均。

显而易见的方法是使用NumPy,使其成为一个真正的2D数组,然后按列调用mean。请参阅simleo's answer,这比我在此处添加的要好。 :)

但是如果你想坚持使用列表列表,那么有效地按列进行转置就意味着zip

>>> from statistics import mean
>>> arrs = [[1., 2., 3.], [0., 0., 0.], [2., 4., 6.]]
>>> column_means = [mean(col) for col in zip(*arrs)]
>>> column_means
[1.0, 2.0, 3.0]

statistics.mean仅在3.4+中的stdlib中,但它基于PyPI上的stats,如果你的Python太老了,你可以自己编写它。在边缘情况下正确处理错误是很棘手的,因此您可能希望查看来自statistics的代码,但如果您只处理接近1的值,则可以以明显的方式执行:< / p>

def mean(iterable):
    total, length = 0.0, 0
    for value in iterable:
        total += value
        length += 1
    return total / length

答案 2 :(得分:0)

ar1 = [1,2,3,4,5,6]
ar2 = [3,5,7,2,5,7]

means = [ (i+j)/2.0 for (i,j) in zip(ar1, ar2)]
print(means)

答案 3 :(得分:-1)

你的意思是

import numpy as np    

ar1 = [1,2,3,4,5,6]
ar2 = [3,5,7,2,5,7]

mean_list = []
for i, j in zip(ar1, ar2):
    mean_list.append(np.array([i,j]).mean())

print(mean_list)
[2.0, 3.5, 5.0, 3.0, 5.0, 6.5]