给出图表列表的平均函数

时间:2015-04-25 10:12:07

标签: python graphics

我需要一个函数,给定一个图表列表,构建一个新函数 图中每个横坐标的纵坐标是所提供的几个图的纵坐标的平均值。

每个图表的数据是一对数字列表,第一个是横坐标,纵坐标是第二个。

该函数应假设所有图形具有相同的横坐标列表。

例如:

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]) 

1 个答案:

答案 0 :(得分:1)

我们可以使用zip函数通过“splat”运算符*轻松地从每个纵坐标列表中添加相应的纵坐标。这告诉zipylists中的每个列表视为参数,因此它将所有这些列表拉到一起,创建一个元组列表。结果列表中的第一个元组包含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])]