我需要一個函数,給予一個繪圖列表,構建一個新的其中每个横坐标的纵坐标是提供的几个图形的纵坐标的平均值的图表。
每个图形的数据是一对数字列表,第一个是横坐标,纵坐标是第二个。
该函数应假定所有图形都具有相同的横坐标列表。
例如:
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
中的每个列表视为一个参数,因此它将所有这些列表压缩在一起,创建一个元组列表。结果列表中的第一个元组包含每个列表的所有 ylist
个成员,结果列表中的第二个元组包含每个列表的所有第 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])]