Я хочу создать матрицу смежности с использованием Python - PullRequest
0 голосов
/ 14 апреля 2010

У меня очень большой набор данных, это почти 450000 строк и две строки, я хочу вычислить матрицу смежности с использованием Python, потому что ранее я пытался сделать это в Matlab, и он показывает ошибку памяти из-за больших значений данных. мои значения данных также начинаются с 100 и доходят до 450000,

Любой может помочь мне в этом вопросе, так как я новичок в Python.

Я должен сначала импортировать файл в python, используя лист Excel или блокнот, а затем вычислить матрицу смежности

Ответы [ 3 ]

1 голос
/ 14 апреля 2010

Если я правильно понимаю ваш вопрос, то вам требуется больше памяти, чем доступно в ОЗУ. Даже с виртуальной памятью вы, вероятно, не можете выделить такой большой блок. Следовательно, ваше решение - записать матрицу смежности в файл при его создании. Этот метод будет работать в MatLab или Python.


Я предполагаю, что вы обрабатываете Измерения топологии на уровне маршрутизатора CAIDA , поскольку формат соответствует вашему описанию. Каждая строка этого файла содержит ребро графа от одного IP-маршрутизатора (столбец 1) к другому (столбец 2). Для полной матрицы смежности 192244 узлов потребуется 4,3 ГБ, при условии, что вы используете только один бит для каждого узла. Я бы все же предложил записать матрицу непосредственно в файл, а не строить ее в памяти.

0 голосов
/ 04 августа 2013

Я бы использовал defaultdict - он прост в использовании и содержит всего несколько строк кода. Я предполагаю, что ваш файл выглядит как

a b
c d

Сначала поместите его в список (http://docs.python.org/2/library/fileinput.html), чтобы формат был [(a, b), (c, d)].

Затем используйте defaultdict:

from collections import defaultdict

adjmat = defaultdict(int)
for edge in list:
    adjmat[edge] = 1

adjmat[a, b] вернет 1, если ребро существует, 0 в противном случае. Если у вас может быть несколько ребер между узлами, вам нужно только изменить это значение на adjmat[edge] += 1, и adjmat[a, b] вернет количество соединенных ребер a и b

0 голосов
/ 14 апреля 2010

Самый простой способ? Хорошо, если у вас более 10000 узлов, но только 45000 ребер, используйте разреженную матрицу SciPy:

http://www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7

SciPy предоставляет различные методы сжатия, чтобы сохранить фактический размер матрицы в памяти (поскольку значения матрицы в основном равны 0). Я уверен, что MatLab также предоставляет пространственно-разреженную матричную структуру данных.

Если вы хотите просто знать, как читать в файле, я бы посоветовал вам сохранить его в виде CSV или текстового файла (нет никакой реальной выгоды в хранении данных в файле Excel). Python поставляется с библиотекой для чтения / записи файлов CSV:

http://docs.python.org/library/csv.html

Если вы действительно хотите использовать файлы XLS, то вы можете использовать либо pyExcelerator (я никогда не использовал это) - http://sourceforge.net/projects/pyexcelerator/ - либо вы можете использовать OpenOffice.org + PyUNO или MS Office + COM.

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