2012-01-27 44 views
0

我正在使用matplotlib來繪製一個圖的點([0,0,0],[0,0,1],[0,0,2],... [ 255,255,255])在x軸上爲我所使用的列表:在python2.7中追加大的列表

from mpl_toolkits.mplot3d import Axes3D 
x=[] 
for i,j,k in product(xrange(256), repeat=3): 
    x.append([i,j,k]) 
y=[] 
for count in x: 
    y.append(probability[count]) # this is how my probability array is stored 

pylab.figure(0) 
pylab.plot(x,y,'b') 
pylab.show() 

這個想法我已經從以前的帖子借來。我是python的新手,所以請幫忙。問題是上面的代碼給出了「內存錯誤」。有人可以提供一個有效的方法來追加元素'x'

+5

你的問題是什麼? – milancurcic 2012-01-27 17:16:28

+0

問題是上面的代碼給出了內存錯誤。那麼,有人可以建議一種有效的方法來將元素附加到x或其他有效的方式來繪製 – 2012-01-27 17:21:39

+2

您正在創建大約256^3 * 4字節的對象,更不用說在append中創建的每個列表的開銷)'。對於只佔用*很多內存的東西來說,使用Python是唯一可行的。有什麼具體原因可以說明你爲什麼這麼做,是否有比通過所有1600萬個值更有效的方法? – Makoto 2012-01-27 17:36:05

回答

7

首先,我不認爲pylab.plot做你認爲它做的,你試圖在3d中顯示一個表面?

其次,你應該真的使用ndarrays,而不是列表這個大的東西。無論如何,我相信matplotlib會將你的列表轉換成ndarrays,所以你最好從數組開始。我認爲以下是你想要的。

x, y, z = np.mgrid[0:256, 0:256, 0:256] 

而在去年,什麼是y,什麼是probability?我問,因爲probability[x[count]]看起來高度懷疑我,我想也許你的意思是probability[count]但即使如此,如果probability是一個列表,它不應該工作,如果它是一個數組它會炸燬,並可能導致你的內存錯誤。 (不知道沒有蹤跡)。

看看Matplotlib Gallery,他們的例子帶有代碼,對於讓事情能夠正常工作非常有幫助。

+0

是的,你糾正了它的概率[數量],我糾正了我的帖子..謝謝。此外,我必須在我的陣列上繪製出許多點...雖然現在我減少了點...但它仍然給我錯誤 – 2012-01-27 18:47:19

+1

請告訴我們你想做什麼。我懷疑,如果你試圖只繪製(5,5,5)部分數據,你會發現你的代碼並沒有按照你的想法進行。我不認爲'概率[count]'是正確的,就像我在我的回答中所說的那樣,如果'probability'是一個列表,它將會失效,如果'probability'是一個數組。 – 2012-01-27 19:18:21

0

x是否必須是列表的列表?它可能是一個元組列表?

如果能,那麼你可以把它簡化爲這樣:

x = list(product(xrange(256), repeat=3)) 
+0

儘管如此,這仍然是2 ** 24元素,在我的機器上一秒鐘就佔用了1.5GB。 – 2012-01-27 17:59:12

+1

numpy ndarray(np.empty((256,256,256),dtype = int))是更好的數據結構。 – matt 2012-01-27 19:20:35

4

以您目前的做法,x將在它16777216(256 )元素。你確定你需要在圖表上繪製這麼多點嗎?如果不是,請考慮抽取一些樣本,例如,只需將xrange(256)替換爲xrange(0, 256, 16)即可將其降至4096個樣本。

如果matplotlib可以通過這樣做,而不是創建列表,它可能是這個樣子繪製iterables不是列表,你可以節省內存:

from itertools import product, imap 

def get_probability(count): 
    return probability[x[count]] # this code is broken, but from your example 

x = product(xrange(256), repeat=3) 
y = imap(get_probability, product(xrange(256), repeat=3)) 
pylab.plot(x, y, 'b') 

正如我在評論中指出的上方, x[count]將下面的代碼無法從你的例子:

for count in x: 
    y.append(probability[x[count]]) 

這是因爲x是列表的列表,所以count將永遠是一個列表像[0, 0, 0],所以在第一循環的一步,您將嘗試x[[0, 0, 0]]並獲得TypeError: list indices must be integers, not list

+0

因爲get_probability是一個函數,所以傳遞給count參數的值是什麼?我是python的新手,所以請解釋一下..這聽起來可能是一個天真的問題,請解釋一下。並且非常感謝幫助 – 2012-01-27 18:04:23

+0

@ user1172532,count是'x'中的一個元素。在Python shell中嘗試:for ['a','b','c']:print(x)'。 Python中的'for'更像是其他可能熟悉的語言中的'foreach'。 – 2012-01-27 18:08:07

+0

@ user1172532 - 查看['imap']的文檔(http://docs.python.org/library/itertools.html#itertools.imap)。 'product'生成的每個元素都會調用'get_probability'。 – 2012-01-27 18:17:28