我正在使用matplotlib在x轴上绘制带有点([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'
答案 0 :(得分: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,他们的示例附带代码,对于让事情有效非常有帮助。
答案 1 :(得分:4)
使用您当前的方法,x
将包含16777216(256 3 )元素。您确定需要在图表上绘制这么多点吗?如果没有,请考虑采取一些样本,例如,只需将xrange(256)
替换为xrange(0, 256, 16)
即可将其减少到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]
之类的列表,因此在循环的第一步中您将尝试{{1}并获得x[[0, 0, 0]]
。
答案 2 :(得分:0)
x
必须是列表清单吗?它可能是一个元组列表吗?
如果可以,那么您可以将其简化为:
x = list(product(xrange(256), repeat=3))