создать матрицу смежности в python - PullRequest
0 голосов
/ 08 сентября 2018

Я хочу загрузить CSV или текстовый файл со знаком (взвешенный) граф и создать матрицу смежности. Файл CSV содержит три столбца с именами «FromNodeId», «ToNodeId» и «Sign». Код, который я использовал, выглядит следующим образом:

G = nx.read_edgelist('soc-sign-epinions.txt', data = [('Sign', int)])
#print(G.edges(data = True))

A = nx.adjacency_matrix(G)
print(A.todense())

Я обнаружил следующую ошибку

ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than 
the maximum possible size

Как я могу решить эту проблему? Пожалуйста, предложите мне способ создать матрицу смежности.

1 Ответ

0 голосов
/ 08 сентября 2018

Память, необходимая для хранения большой матрицы, может легко выйти из-под контроля, поэтому nx.adjacency_matrix(G) возвращает «разреженную матрицу», которая хранится более эффективно (при использовании такого количества записей будет 0).

Поскольку у вашего графа 131000 вершин, вся матрица смежности будет использовать около 131000^2 * 24 bytes (целое число занимает 24 байта памяти в python), что составляет около 400 ГБ. Тем не менее, ваш график имеет менее 0,01% всех ребер, иными словами, он очень разреженный и разреженные матрицы будут работать для вас.

Чтобы получить разреженную матрицу, просто используйте A = nx.adjacency_matrix(G), не вызывая A.todense() после нее (это попытается сохранить ее снова нормально).

Существует встроенная функция scipy.sparse для эффективного сохранения и загрузки разреженных матриц, см. здесь . Например, чтобы сохранить разреженную матрицу A, используйте

scipy.sparse.save_npz('filename.npz', A)

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

for i in range(A.shape[0]): row = A.getrow(i).todense() [write row to file using your preferred method]

Это может занять несколько минут, но должно работать (я тестировал путь такого же размера).

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