2010-03-17 7 views
2

У меня есть данные с координатами x, y. Я пытаюсь следовать ответ на how to get a scatter dataset to be represented as a heatmap, но когда я иду черезMemoryError при работе Numpy Meshgrid

X, Y = np.meshgrid(x, y)

инструкция с моими массивами данных я получаю MemoryError. Я новичок в numpy и matplotlib и по существу пытаюсь запустить это, адаптируя примеры, которые я могу найти.

Вот как я построил свои массивы из файла, который хранится их:

XY_File = open ('XY_Output.txt', 'r') 
XY = XY_File.readlines() 
XY_File.close() 

Xf=[] 
Yf=[] 
for line in XY: 
    Xf.append(float(line.split('\t')[0])) 
    Yf.append(float(line.split('\t')[1])) 
x=array(Xf) 
y=array(Yf) 

Есть проблема с моими массивами? Этот же код работал, когда помещался в this example, но я не слишком уверен.

Почему я получаю этот MemoryError и как я могу это исправить?

+1

Это не связано с вашими проблемами с памятью (которые из-за того, что вы делаете * огромный * meshgrid из этих крошечных вещей), но наиболее подходящим для цикла над файлом является 'open ('XY_Output.txt', 'r'). как f: для строки в f: '. 'With' гарантирует, что файл закрывается * независимо от того, что * и цикл по файлу не позволяет ему сразу считывать память. (Это не проблема памяти здесь, но она по-прежнему бесполезна.) –

+0

Спасибо за этот отзыв Майка, но это, похоже, не работает в Python 2.5, и это то, что я запускаю. (по крайней мере, это дает мне ошибку, заявляя, что «как» зарезервировано в python 2.6) Правильно ли я? Это гораздо более простой способ сделать это, это правда ... – greye

+0

Вы можете добавить 'из __future__ import with_statement' вверху. Но вы все равно можете улучшить код, переместив оператор readlines в строку 'in line в XY_File.readlines()' и положив конец в конец. –

ответ

5

Ваш звонок в meshgrid требует много памяти - он производит два массива с плавающей запятой 8823 * 8823. Каждый из них составляет около 0,6 ГБ.

Но ваш экран не может показать (и ваш глаз не может действительно обработать), что много информации в любом случае, поэтому вам, вероятно, следует подумать о том, как сгладить ваши данные до чего-то более разумного, такого как 1024 * 1024, прежде чем вы это сделаете шаг.

+0

Я не вычисляю '8823 * 8823 * 8 байтов = 600 МБ' или так правильно? В любом случае, это реалистично, что это 1.2GB может подтолкнуть пределы нормальной машины. –

+0

Так вот что происходит! Я знал, что мне не нужен образ 8823x8823. Я хочу, чтобы взять все эти точки данных и отразить их частоту появления на изображении, преобразуя график рассеяния, который будет иметь много перекрывающихся точек в тепловой карте, которая показывает более высокую частоту в некоторых областях. Не возражаете взглянуть на http://stackoverflow.com/questions/2369492/generate-a-heatmap-in-matplotlib-using-a-scatter-data-set, а также ответить там, если вы знаете, как я мог бы это достичь ? Я собираюсь отметить этот ответ как принятый, потому что он объясняет проблему в моем вопросе. – greye

+0

@Mike Конечно, вы есть. Здесь рано ... –

1

in numpy 1.7.0 и новее meshgrid имеет аргумент ключевого слова sparse. Редкий meshgrid настроен так, чтобы он транслировался до полного meshgrid при его использовании. Это может сэкономить большие объемы памяти, например. при использовании meshgrid для индексирования массивов.

In [2]: np.meshgrid(np.arange(10), np.arange(10), sparse=True) 
Out[2]: 
[array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]), array([[0], 
    [1], 
    [2], 
    [3], 
    [4], 
    [5], 
    [6], 
    [7], 
    [8], 
    [9]])] 

Другой вариант заключается в использовании небольших целых чисел, которые до сих пор в состоянии представить диапазон:

np.meshgrid(np.arange(10).astype(np.int8), np.arange(10).astype(np.int8), 
      sparse=True, copy=False) 

, хотя, как из Numpy 1.9 с использованием этих меньших чисел для индексации будет медленнее, так как они внутренне будут преобразованы назад к большим целым числам в небольших (np.setbufsize размера) кусках.

Смежные вопросы