Добавлять большие списки в python2.7 - PullRequest
0 голосов
/ 27 января 2012

Я использую matplotlib для построения графика с точками ([0,0,0], [0,0,1], [0,0,2], ... [255,255,255]) на оси Xдля этого я использую список:

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'

Ответы [ 3 ]

7 голосов
/ 27 января 2012

Во-первых, я не думаю, что 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 , их примеры поставляются с кодом и очень полезны для работы.

4 голосов
/ 27 января 2012

При вашем текущем подходе x будет содержать 16777216 (256 3 ) элементов. Вы уверены, что вам нужно построить столько точек на графике? Если нет, подумайте о том, чтобы взять какой-то образец, например, вы можете сократить его до 4096 образцов, просто заменив xrange(256) на xrange(0, 256, 16).

Если 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.

0 голосов
/ 27 января 2012

Должен ли x быть списком списков? Это может быть список кортежей?

Если можно, то вы можете упростить это до:

x = list(product(xrange(256), repeat=3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...