[英]Append large lists in python2.7
我正在使用matplotlib在i軸上繪制帶有點([0,0,0],[0,0,1],[0,0,2],... [255,255,255])的圖正在使用清單:
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”的有效方法
首先,我認為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 ,他們的示例附帶了代碼,它們對使事情正常工作非常有幫助。
按照您當前的方法, x
中將包含16777216(256 3 )個元素。 您確定需要在圖形上繪制這么多點嗎? 如果不是,請考慮對其進行一些采樣,例如,您可以通過簡單地將xrange(256)
替換為xrange(256)
xrange(0, 256, 16)
xrange(256)
來將其縮減為4096個采樣。
如果matplotlib可以繪制可迭代對象而不是列表,則可以通過這樣做而不是創建列表來節省內存,它可能類似於以下內容:
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
。
x
是否必須是列表列表? 可以是元組列表嗎?
如果可以,則可以簡化為:
x = list(product(xrange(256), repeat=3))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.