我有一份清单清单: 类似的东西:
data = [[240, 240, 239],
[250, 249, 237],
[242, 239, 237],
[240, 234, 233]]
我希望像
一样平均[average_column_1, average_column_2, average_column_3]
我的代码就像不太优雅。 这是通过列表的天真方式,将总和保持在单独的容器中,然后除以元素的数量。
我认为有一种pythonic方法可以做到这一点。 有什么建议? 感谢
答案 0 :(得分:53)
Pure 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))
印刷
[243.0, 240.5, 236.5]
NumPy的:
a = numpy.array([[240, 240, 239],
[250, 249, 237],
[242, 239, 237],
[240, 234, 233]])
print numpy.mean(a, axis=0)
Python 3:
from statistics import mean
a = [[240, 240, 239],
[250, 249, 237],
[242, 239, 237],
[240, 234, 233]]
print(*map(mean, zip(*a)))
答案 1 :(得分:23)
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]
这是有效的,因为zip(*data)
将为您提供一个列有分组列的列表,float()
调用仅在Python 2.x上调用,它使用整数除法,除非使用from __future__ import division
。
答案 2 :(得分:14)
使用zip()
,如下所示:
averages = [sum(col) / float(len(col)) for col in zip(*data)]
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]]
通过对每个切片执行sum()
,您可以有效地获得按列的总和。只需除以列的长度即可得到均值。
侧点:在Python 2.x中,默认情况下整数除以十进制,这就是调用float()
将结果“提升”为浮点类型的原因。
答案 3 :(得分: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])
似乎工作。
答案 4 :(得分:0)
您可以使用map
和zip
:
list(map(lambda x: sum(x)/len(x), zip(*data)))
[243.0, 240.5, 236.5]