我需要一个函数,给定一个图表列表,构建一个新函数 图中每个横坐标的纵坐标是所提供的几个图的纵坐标的平均值。
每个图表的数据是一对数字列表,第一个是横坐标,纵坐标是第二个。
该函数应假设所有图形具有相同的横坐标列表。
例如:
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])
答案 0 :(得分:1)
我们可以使用zip
函数通过“splat”运算符*
轻松地从每个纵坐标列表中添加相应的纵坐标。这告诉zip
将ylists
中的每个列表视为参数,因此它将所有这些列表拉到一起,创建一个元组列表。结果列表中的第一个元组包含ylist
中每个列表的所有第一个成员,结果列表中的第二个元组包含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])]