Как разбить на куски (подматрицы) или обработать огромную матрицу, что дает ошибку памяти на numpy? - PullRequest
0 голосов
/ 01 марта 2019

У меня действительно большая матрица, которая просто не помещается в память.Матрица, с которой мне приходится работать, имеет 483798149136 элементов, это означает 483 миллиарда чисел с плавающей запятой.

Подход, о котором я думал, заключался в том, чтобы как-то разбить эту огромную матрицу на разные подматрицы, которые помещаются в память, выполнить объединение операций над этими подматрицами, а затем объединение их всех для восстановления исходной матрицы, которая, как мы надеемся, будет помещаться в память после всех операций объединения.

Пожалуйста, исправьте меня, если я ошибаюсь,этот подход был просто идеей, с которой я выступил, насколько хорошо или плохо, я не знаю.Если у вас есть лучшие альтернативные идеи, я открыт для любых предложений.

Код для воспроизведения этой матрицы:

a = np.arange(695556).reshape(834,834)
np.meshgrid(a,a)

Я читал это post и this post, среди прочих на этом же сайте, но ни один из них не дает истинного решения подобных проблем, они просто дают смутные предложения.

Мои вопросы сейчас:

  1. Возможен ли мой подход к разделению и объединению или есть ли другие более эффективные способы сделать это?

  2. Как (в терминах кода) я могу разделитьэту матрицу разбить на части (например, окна или многомерное ядро) и позже перестроить ее снова

  3. Есть ли какой-нибудь способ обработки матрицы в кусках в numpy для выполнения операций с матричным модулем, напримерумножение, сложение и т. д. ...

  4. Есть ли в Python специальный пакет, который помогает решать подобные задачи с матрицами

РЕДАКТИРОВАТЬ

SincЕсли некоторые пользователи спрашивают меня о цели всей этой операции, я предоставлю некоторую информацию:

Я работаю над проектом 3D-печати.В процессе есть лазерный луч, который плавит металлический порошок для создания сложных металлических деталей.В этих частях есть слои, и лазер расплавляет металл слой за слоем.

У меня есть 3 файла CSV, каждый из которых содержит матрицу 834 x 834. Первая матрица содержит значения координат оси XКогда лазерный луч проходит через слой порошка и плавит металл, вторая матрица одинакова для оси Y, а третья матрица представляет время, в течение которого лазер плавится в той же точке пикселя.Значения выражены в секундах.

Итак, у меня есть координаты лазера, проходящего через оси X и Y, и время, необходимое для плавления каждой точки.

Эта матрица получается изизображения сечений каждой изготовленной детали.

Проблема заключается в том, что температура в определенном пикселе и время, в течение которого лазер стоит на этом пикселе, могут оказывать влияние на n пикселей, когда лазер попадает туда.Итак, я хочу создать матрицу расстояний, которая скажет мне, насколько различны или похожи по евклидову расстоянию каждый пиксель изображения друг на друга.

Вот почему, если у меня есть, например, 2 834 x 834 матрицы, янеобходимо создать матрицу 695556 x 695556 с расстояниями между каждой отдельной точкой в ​​матрице друг к другу.И именно поэтому он так велик и не умещается в памяти.

Я не знаю, дал ли я слишком много информации, или мои объяснения запутаны.Вы можете спросить все, что вам нужно, и я постараюсь прояснить это, но суть в том, что мне нужно создать эту огромную матрицу расстояний в ordr, чтобы узнать математические расстояния между пикселями, а затем узнать связь между тем, что происходит вопределенная точка изделия при печати и то, что должно произойти в других точках, чтобы избежать производственных дефектов.

Большое спасибо заранее

1 Ответ

0 голосов
/ 04 марта 2019

В конце концов, я нашел способ решить мою проблему.Эти огромные матрицы могут быть легко обработаны с помощью dask .Dask - это библиотека Python, которая позволяет распределенным вычислениям и делению данных на куски оптимизировать использование памяти.Это довольно удобно, так как действительно позволяет работать с буквально огромными и массивными данными при действительно низких затратах на вычисления и память, очевидно, не так быстро, как в памяти, но я думаю, что очень люди будут рады узнать об этом.

Этот пакет довольно хорошо оптимизирован и часто обновляется.Лучше всего то, что он имеет синтаксис numpy / pandas, он также работает с информационными кадрами так же, как с массивами, и если вы знаете pandas / numpy, вы будете чувствовать себя как дома с dask.

Вы можете создатьраспределенный массив dask, подобный следующему:

import numpy as np
import dask.array as da

Y = da.random.normal(size=(695556, 695556),
                         chunks=(1000, 1000))

, а затем вы можете выполнить над ним некоторые операции, например:

y = Y.mean(axis=0)[0:100].compute()

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

Есть несколько практических примеров, которые я нашел очень показательными здесь .

Кроме того, область действия массива объяснений в этой библиотеке можно найти здесь .

И, наконец, руководство по высокопроизводительным вычислениям в Python 3.X здесь .

Надеюсь, что это поможет кому-то с такой же проблемой.

...