Проблемы с памятью при создании матрицы смежности с использованием Coo-matrix - PullRequest
0 голосов
/ 01 октября 2018

Привет, я пытаюсь сгенерировать матрицу смежности с размером около 24 000 из CSV с двумя столбцами, показывающими комбинации пар генов и столбцом 1, чтобы указать на настоящее взаимодействие .... Моя цель - иметь егобыть квадратным и заполненным нулями для комбинаций не в двух столбцах

Я использую следующий скрипт Python

import numpy as np
from scipy.sparse import coo_matrix

l, c, v = np.loadtxt("biogrid2.csv", dtype=(int), skiprows=0, delimiter=",").T[:3, :]
m =coo_matrix((l, (v-1, c-1)), shape=(v.max(), c.max()))

m.toarray()

, и он работает нормально, пока не встретится следующая ошибка. Кажется,

File "/home/charlie/anaconda3/lib/python3.6/site-packages/scipy/sparse/base.py", line 1184, in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)

MemoryError

Любые идеи о том, как обойти ограничение памяти в Scipy

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Скорее всего, вы хотите не m.toarray, а m.tocsr().матрица csr может выполнять простую линейную алгебру (например, .dot() и степени матрицы), например, это работает:

m.tocsr()
random_walk_2 = m.dot(m)
random_walk_n = m ** n  
# see https://stackoverflow.com/questions/28702416/matrix-power-for-sparse-matrix-in-python

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

РЕДАКТИРОВАТЬ: Чтобы преобразовать вывод обратно в более простой формат для считывания до csv, вы можете вернуться к coo с .tocoo()

m.tocoo()
out = np.c_[m.data, m.row, m.col].T
np.savetxt("foo.csv", out, delimiter=",") 
# see /7634619/damp-massiva-numpy-v-csv-fail
0 голосов
/ 01 октября 2018

Функция toarray() преобразует вашу разреженную матрицу 24000 * 24000 (coo_matrix) в плотный массив 24000 * 24000 (при условии, что вы загружаете int), который требует с точки зрения памяти по крайней мере

24000 * 24000 * 4 = около 2,15 ГБ.

Чтобы избежать использования такого большого объема памяти, следует избегать преобразования в плотную матрицу (используя toarray()) и выполнять операции с разреженной матрицей

Если вам нужна матрица в квадрате, вы можете просто сделать m*m или m.multiply(m), и вы получите разреженную матрицу.

Чтобы сохранить свою матрицу, у вас есть несколько вариантов.

Простейшим является NPZ, см. https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.sparse.save_npz.html или Сохраните / загрузите scipy разреженный csr_matrix в формате переносимых данных

Если вы хотите получить свой результат в качестве начальногоCSV-файл coo_matrix имеет атрибуты

data массив данных формата COO матрицы данных

строка массив индексов строки формата COO матрицы

столбец массива индекса столбца формата COOматрица

см. https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.coo_matrix.html

, которую можно использовать для создания файла CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...