2013-02-11 137 views
2

在发布之前,我已搜索并搜索(4天)。如果太初级,我会提前道歉,浪费你的时间。我已经成功地使用pyplot生成了一些基本图,使用他们的教程示例成功生成了matplotlib,但无法完成我需要完成的任务。计算并绘制(Y)总数列表中每个(X)项目的平均值

本质:

  • 我有一个存在于单个文件号码清单。
  • 每行包含一个数字,对应于完成某个重复任务所需的毫秒数。
  • 在这个文件中有超过一百万个条目,并且它可以超出这个范围。

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

从我可以告诉,我并不需要无限期地存储变量的值,只有通过他们,因为他们被处理(按顺序)到绘图仪。我尝试了下面的例子来总结上面列表中的5个条目的范围(其中有20个),但我不知道如何一次动态地通过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 

回答

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。这样你会覆盖初始数据并保存一些内存。

我希望这有助于

+5

如果len(x)%5!= 0,这会炸掉。我会使用'A = x [:(n // 5)* 5] .reshape(5,-1)' – tacaswell 2013-02-11 17:59:11

+0

@user谢谢您的建议。我很欣赏快速反应。我能够使用你的方法进行绘图。我现在试图弄清楚如何使用你提供的东西,以及sotapme给我什么来绘制平均值。再次感谢! – TheDudeAbides 2013-02-11 19:09:05

+0

@tcaswell感谢您的洞察力。我实施了你的建议。 – TheDudeAbides 2013-02-11 19:09:45

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将填补其余与Noneimapizip WIL截断。我可以想象,OP会希望使用itertools.izip_longest(*iterables[,fillvalue])作为可选的填充值,尽管None对于No Values是一个很好的哨兵。

我希望能够清楚说明余下的情况。

+0

非常感谢您的帮助;我已经实现了你的想法,现在可以直接从我的文件中看到5次的平均值。但是 - 如果我不知道范围会怎样。例如,我想每次取100个,直到文件结束。 (可能是500k,100万,或者只有几千,总是可变的。)其余的会用类似mod的东西四舍五入吗?我可以去掉非100的最后一块,或者除以100来得到准确的指标吗? – TheDudeAbides 2013-02-11 20:35:57

+0

添加细节以解答。 – sotapme 2013-02-12 01:34:16