我需要一个函数,给定一个图形列表,该函数可以构建一个新图形,其中每个横坐标的纵坐标是所提供的几个图形的纵坐标的平均值。
每个图的数据是一对数字列表,其中第一个是横坐标,第二个是纵坐标。
该函数应假定所有图形都具有相同的横坐标列表。
例如:
abscissa = range(1, 4)
graphs = [
(abscissa, [1, 2, 3]),
(abscissa, [4, 5, 6]),
(abscissa, [7, 8, 9])
]
function(graphs)
预期收益function(graphs)
:
([1, 2, 3], [4.0, 5.0, 6.0])
zip
通过使用“ splat”运算符,我们可以使用该功能轻松地从每个坐标列表中添加相应的坐标*
。这告诉zip
将每个列表都ylists
视为一个参数,因此它将所有这些列表压缩在一起,从而创建一个元组列表。结果列表中的第一个元组包含列表中每个列表的所有第1个成员,结果列表中ylist
的第2个元组包含列表中每个列表的所有第2个成员ylist
,等等。
#!/usr/bin/env python
''' Find means of graph data '''
def mean_graph(graphs):
abscissa = graphs[0][0]
#Extract ordinate lists
ylists = [g[1] for g in graphs]
#Find means of corresponding ordinates
size = float(len(graphs))
means = [sum(v) / size for v in zip(*ylists)]
return abscissa, means
abscissa = range(1, 4)
graphs = [
(abscissa, [1, 2, 3]),
(abscissa, [4, 5, 6]),
(abscissa, [7, 8, 9]),
]
print(mean_graph(graphs))
输出
([1, 2, 3], [4.0, 5.0, 6.0])
我在Python 2.6.6上开发了以上代码。在Python 3上,您可以更改
size = float(len(graphs))
为
size = len(graphs)
FWIW,可以将mean_graph
函数压缩为一行,尽管这样做确实使阅读起来有些困难:
def mean_graph(graphs):
return graphs[0][0], [sum(v) / float(len(graphs)) for v in zip(*[g[1] for g in graphs])]
或对于Python 3:
def mean_graph(graphs):
return graphs[0][0], [sum(v) / len(graphs) for v in zip(*[g[1] for g in graphs])]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句