2012-01-27 59 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