计算和绘制(Y)总计列表中每个(X)项的平均值

时间:2013-02-11 17:03:10

标签: python numpy python-2.7 matplotlib

我在发布之前已经搜索过并搜索过(4天)。如果它过于基本,我会提前道歉,浪费你的时间。我已经使用pyplot和matplotlib成功生成了一些基本图,使用了他们的教程示例,但无法实现我需要完成的任务。

本质:

  • 我有一个存在于单个文件中的数字列表。
  • 每行包含一个与完成所需的毫秒数相对应的数字 一定的重复任务。
  • 此文件中有超过一百万个条目,并且可以超越这个条目。

20的例子:

173
1685
1152
253
1623
390
84
40
319
86
54
991
1012
721
3074
4227
4927
181
4856
1415

最终我需要做的是计算一个单独的总数范围(均匀分布在绝对总条目数上) - 然后使用任何python的绘图库来绘制这些平均值。我考虑过使用pyplot来方便使用。

  • X轴将对应于已完成任务的总数,因为Y轴将表示完成任务所需的毫秒数(对于此示例,每5个完成任务所需的平均时间)。

即:

Entries 1-5 = (plottedTotalA)
Entries 6-10 = (plottedTotalB)
Entries 11-15 = (plottedTotalC)
Entries 16-20 = (plottedTotalD)

据我所知,我不需要无限期地存储变量的值,只需在处理(按顺序)时将它们传递给绘图仪。我已经尝试了以下示例来对上面的20个列表中的5个条目(其中有效)进行求和,但我不知道如何一次动态传递5个直到完成,同时保留计算的平均值将最终传递给pyplot。

例如:

Python 2.7.3 (default, Jul 24 2012, 10:05:38) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> plottedTotalA = ['173', '1685', '1152', '253', '1623']
>>> sum(float(t) for t in plottedTotalA)
4886.0

2 个答案:

答案 0 :(得分:4)

假设您在名为x的列表中有n个值。然后将x重新整形为具有5列的数组A并计算每条线的平均值。然后你可以简单地绘制结果矢量。

x = np.array(x)
n = x.size
A = x[:(n // 5) * 5].reshape(5, -1)
y = A.mean(axis = 0)
plot(y)

编辑:根据tacaswell的评论

更改了我的代码

但是,如果实际上有超过一百万个条目,则可能会遇到内存问题。您也可以使用名称x而不是A和y。这样你就可以覆盖初始数据并节省一些内存。

我希望这会有所帮助

答案 1 :(得分:1)

我已经解决了如何从文件生成的列表中获取5个项目的问题。 正如你所说:

  

我不知道如何一次动态传递5直到完成,

我已经使用了/dev/random因为它永远不会结束并且随机并模拟你的大文件并显示处理大文件而不会读入列表或类似的数据。

################################################################################
def bigfile():
    """Never ending list of random numbers"""
    import struct
    with open('/dev/random') as f:
        while True:
            yield  struct.unpack("H",f.read(2))[0]
################################################################################
def avg(l):
    """Noddy version"""
    return sum(l)/len(l)
################################################################################

bigfile_i = bigfile()

import itertools
## Grouper recipe @ itertools
by_5  = itertools.imap(None, *[iter(bigfile_i)]*5)

# Only take 5, 10 times.
for x in range(10):
    l = by_5.next()
    a = avg(l)
    print l, a ## PLOT ?

修改

详细说明剩下的事情。

如果我们假装文件有11行,我们每次需要5行:

In [591]: list(itertools.izip_longest(*[iter(range(11))]*5))
Out[591]: [(0, 1, 2, 3, 4), (5, 6, 7, 8, 9), (10, None, None, None, None)]

In [592]: list(itertools.imap(None, *[iter(range(11))]*5))
Out[592]: [(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]

In [593]: list(itertools.izip(*[iter(range(11))]*5))
Out[593]: [(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]

在一个案例中,izip_longest将使用None填充剩余部分,而imapizip将截断。我可以想象OP可能希望使用itertools.izip_longest(*iterables[,fillvalue])作为可选填充值,尽管NoneNo Values的良好哨兵。

我希望能明确其余部分会发生什么。