Сохранение и доступ к атрибутам узлов 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