我有一个列表列表:类似于:
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)
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()就是调用将结果"提升"为浮点类型的原因.
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)
似乎可以工作。
| 归档时间: |
|
| 查看次数: |
30275 次 |
| 最近记录: |