平均列表python

Moh*_*hit 28 python

我有一个列表列表:类似于:

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]
Run Code Online (Sandbox Code Playgroud)

我希望将其平均化

[average_column_1, average_column_2, average_column_3]
Run Code Online (Sandbox Code Playgroud)

我的代码就像不太优雅.这是通过列表的天真方式,将总和保持在单独的容器中,然后除以元素的数量.

我认为有一种pythonic方式来做到这一点.有什么建议?谢谢

Sve*_*ach 55

纯Python:

from __future__ import division
def mean(a):
    return sum(a) / len(a)
a = [[240, 240, 239],
     [250, 249, 237], 
     [242, 239, 237],
     [240, 234, 233]]
print map(mean, zip(*a))
Run Code Online (Sandbox Code Playgroud)

印花

[243.0, 240.5, 236.5]
Run Code Online (Sandbox Code Playgroud)

NumPy的:

a = numpy.array([[240, 240, 239],
                 [250, 249, 237], 
                 [242, 239, 237],
                 [240, 234, 233]])
print numpy.mean(a, axis=0)
Run Code Online (Sandbox Code Playgroud)

Python 3:

from statistics import mean
a = [[240, 240, 239],
     [250, 249, 237], 
     [242, 239, 237],
     [240, 234, 233]]
print(*map(mean, zip(*a)))
Run Code Online (Sandbox Code Playgroud)

  • @BlaXpirit:NumPy解决方案更容易阅读,更简洁,更快速并且使用更少的内存,所以我提到了无论如何使用NumPy的人.为什么你认为`map()`存在,并且仍然存在于Python 3.x中? (8认同)
  • @ ms4py:`from future_builtins import map,zip`如果你决定走这条路线 (3认同)
  • +1整洁..看第一个解决方案只是证明了如何顺利的Python代码 (2认同)
  • `map`在任何方面都不是"pythonic",谁需要`numpy`在这里?**这个*是接受的答案? (2认同)

And*_*ark 24

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]
avg = [float(sum(col))/len(col) for col in zip(*data)]
# [243.0, 240.5, 236.5]
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它zip(*data)会为您提供一个列出分组列的列表,float()只有在Python 2.x上才需要调用,除非使用整数除法from __future__ import division.


voi*_*hos 14

使用zip(),像这样:

averages = [sum(col) / float(len(col)) for col in zip(*data)]
Run Code Online (Sandbox Code Playgroud)

zip()获取多个可迭代的参数,并返回那些迭代的切片(作为元组),直到其中一个迭代不能再返回任何东西.实际上,它执行转置操作,类似于矩阵.

>>> data = [[240, 240, 239],
...         [250, 249, 237], 
...         [242, 239, 237],
...         [240, 234, 233]]

>>> [list(col) for col in zip(*data)]
[[240, 250, 242, 240],
 [240, 249, 239, 234],
 [239, 237, 237, 233]]
Run Code Online (Sandbox Code Playgroud)

通过sum()对每个切片执行操作,您可以有效地获得按列的总和.只需除以列的长度即可得到平均值.

侧点:在Python 2.x中,默认情况下整数除以十进制,这float()就是调用将结果"提升"为浮点类型的原因.

  • 值得添加一个解释:`zip`是一个函数,它接受多个序列并在"逐列"的基础上返回元组.所以它返回(x [0] [0],x [1] [0],x [2] [0])然后(x [1] [0],x [1] [1],x [1] [2])等等.但是,一旦给定行的项目用完,它就会停止检索.在代码中绘制图表更容易,注意它是如何工作的? (5认同)

Ore*_*ren 6

import numpy as np

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]

np.mean(data, axis=0)
# array([ 243. ,  240.5,  236.5])
Run Code Online (Sandbox Code Playgroud)

似乎可以工作。