MemoryError при запуске Numpy Meshgrid - PullRequest
4 голосов
/ 17 марта 2010

У меня есть 8823 точек данных с координатами x, y. Я пытаюсь проследить за ответом на , как получить набор данных разброса, который будет представлен как тепловая карта , но когда я прохожу через

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)

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

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

Ответы [ 3 ]

7 голосов
/ 17 марта 2010

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

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

1 голос
/ 04 июня 2014

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

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) кусками.

0 голосов
/ 01 августа 2018

Когда вы вызываете np.meshgrid для точного разброса, вам нужно нормализовать ваши данные, если они слишком велики для обработки, попробуйте этот модуль

    # Feature Scaling
from sklearn.preprocessing import StandardScaler
st = StandardScaler()
X = st.fit_transform(X)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...