给出图形列表的均值函数



我需要一個函数,給予一個繪圖列表,構建一個新的其中每个横坐标的纵坐标是提供的几个图形的纵坐标的平均值的图表。

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

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

例如:

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" 运算符 * 轻松地从每个纵坐标列表中添加相应的纵坐标。这告诉zipylists中的每个列表视为一个参数,因此它将所有这些列表压缩在一起,创建一个元组列表。结果列表中的第一个元组包含每个列表的所有 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])]

相关内容

  • 没有找到相关文章