2013-02-11 54 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