Сохранение и доступ к атрибутам узлов python networkx

У меня есть сеть узлов, созданных с использованием python networkx. Я хочу хранить информацию в узлах, чтобы я мог получить доступ к информации позже на основе метки узла (имя узла) и поля, в котором хранилась информация (например, атрибутов узла). информация, хранящаяся в памяти, может быть строкой или номером, который я хочу сделать так, чтобы, если xyz является узлом:

то я хочу сохранить два или три поля, имеющие строки, такие как дата рождения xyz dob=1185, место рождения xyz pob=usa и день рождения xyz dayob=monday.

Я знаю, что я могу использовать G.add_node имеет в нем поле слова атрибута... но я не могу получить доступ к нему для определенного поля. если есть какой-либо другой способ, я был бы признателен.

Затем я хочу сравнить xyz с другими узлами в сетях, имеющих общую информацию. т.е. пересечение узла xyz с узлом abc на основе даты бита, места рождения и дня рождения

например, если узлы xyz и abc имеют dob печать своих соответствующих dob s, их pob и их dayob s

Ответ 1

Как вы говорите, это просто вопрос добавления атрибутов при добавлении узлов на график

G.add_node('abc', dob=1185, pob='usa', dayob='monday')

или как словарь

G.add_node('abc', {'dob': 1185, 'pob': 'usa', 'dayob': 'monday'})

Чтобы получить доступ к атрибутам, просто получите к ним доступ, как и в любом словаре

G.node['abc']['dob'] # 1185
G.node['abc']['pob'] # usa
G.node['abc']['dayob'] # monday

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

for n1, n2 in G.edges_iter():
    print G.node[n1]['dob'], G.node[n2]['dob']
    print G.node[n1]['pob'], G.node[n2]['pob']
    # Etc.

Начиная с networkx 2.0, G.edges_iter() был заменен на G.edges(). Это также относится к узлам. Мы устанавливаем data=True для доступа к атрибутам. Код сейчас:

for n1, n2 in list(G.edges(data=True)):
    print G.node[n1]['dob'], G.node[n2]['dob']
    print G.node[n1]['pob'], G.node[n2]['pob']
    # Etc.

Ответ 2

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

import networkx as nx
G=nx.Graph()
G.add_edge(1,2)
G.node[1]['name'] = 'alpha'
G.node[2]['name'] = 'omega'

G.node[1]['name']
> 'alpha'

Вы также можете использовать set_node_attributes (документация), которая позволит вам установить атрибут для нескольких узлов одновременно:

#use the next line if it networkx version 1.x
#nx.set_node_attributes(G, 'cost', {1:3.5, 2:56})

#use the next line if it networkx version 2.x
nx.set_node_attributes(G, {1:3.5, 2:56}, 'cost')

G.node[1]['cost']
> 3.5

Аналогичные подходы могут использоваться для установки атрибутов ребер.

Ответ 3

Начиная с networkx v2.0, вы можете использовать:

import networkx as nx

G = nx.Graph()
G.add_node('abc', dob=1185, pob='usa', dayob='monday')
nx.get_node_attributes(G, 'dob')
> {'abc': 1185}

Вы можете получить доступ к этому словарю, как обычно:

{'abc': 1185}['abc']
> 1185