Networkx - читать список смежностей из файла - PullRequest
0 голосов
/ 31 августа 2018

Я занимаюсь проектом машинного обучения, связанным с предсказанием ссылок. Но я застрял при чтении данных с помощью networkX:

Учебные данные, которые я пытаюсь прочитать, хранятся в файле train.txt со следующей структурой:

1 2
2 3
4 3 5 1

Каждая строка представляет узел и его соседей, то есть в строке 3: узел 4 связан с узлами 3, 5 и 1.

Код, который я использую для чтения сетевых данных:

G = nx.read_edgelist('train.txt',delimiter = "\t",create_using = nx.DiGraph(),nodetype = int)

Но этот код вызывает исключение TypeError: не удалось преобразовать данные ребер следующим образом:

TypeError: Не удалось преобразовать данные ребра (['3105725', '2828522', '4394015', '2367409', '2397416', ..., '759864']) в словарь.

Ответы [ 2 ]

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

nx.read_edgelist ожидает строку на ребро с произвольными данными, в дополнение к источнику и назначению ребра, так что это не то, что вы должны использовать в вашем случае.
networkx предлагает способ чтения списка смежности из файла, используя nx.read_adjlist .
Рассмотрим файл graph_adjlist.txt.

1   2   3   4
2   5
3   5
4   5

График может быть создан в соответствии со списком смежности следующим образом.

import networkx as nx

G = nx.read_adjlist('graph_adjlist.txt', create_using = nx.DiGraph(), nodetype = int)

print(G.nodes(),G.edges())
# [1, 2, 3, 4, 5] [(1, 2), (1, 3), (1, 4), (2, 5), (3, 5), (4, 5)]
0 голосов
/ 31 августа 2018

Добро пожаловать в ТАК!

Ваш комментарий верен - это не крайний список в классическом смысле. Список границ для networkx выглядит примерно так:

1 2
2 3
4 1
4 3
4 5

Вот один из способов решения вашей проблемы: читайте в файле строку за строкой и добавляйте каждое ребро к вашему графику по мере продвижения.

import networkx as nx

D= nx.DiGraph()
with open('train.txt','r') as f:
    for line in f:
        line=line.split('\t')#split the line up into a list - the first entry will be the node, the others his friends
        if len(line)==1:#in case the node has no friends, we should still add him to the network
            if line[0] not in D:
                nx.add_node(line[0])
        else:#in case the node has friends, loop over all the entries in the list
            focal_node = line[0]#pick your node
            for friend in line[1:]:#loop over the friends
                D.add_edge(focal_node,friend)#add each edge to the graph

nx.draw_networkx(D) #for fun draw your network

Looks good!

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