J'ai un réseau de nœuds créé à l'aide de python networkx
. Je veux stocker des informations dans des nœuds afin que je puisse accéder aux informations plus tard en fonction de l'étiquette du nœud (le nom du nœud) et le champ dans lequel les informations ont été stockées (comme les attributs de nœud). les informations stockées peuvent être une chaîne ou un nombre que je souhaite faire de telle sorte que si xyz
est un nœud:
alors je veux enregistrer deux ou trois champs ayant des chaînes comme la date de naissance de xyz
dob=1185
, le lieu de naissance de xyz
pob=usa
, et le jour de naissance de xyz
dayob=monday
.
Je sais que je peux utiliser G.add_node
contient le champ du dictionnaire d'attributs ... mais je n'arrive pas à y accéder pour un champ particulier. s'il y a une autre manière je l'apprécierais.
je veux ensuite comparer xyz
avec d'autres nœuds des réseaux ayant les mêmes informations en commun. c'est-à-dire l'intersection du nœud xyz
avec le nœud abc
en fonction de la date de naissance, du lieu de naissance et du jour de naissance
par exemple, si les nœuds xyz
et abc
ont un Edge imprimant leurs dob
s respectifs, leurs pob
s et leurs dayob
s
Comme vous le dites, il s'agit simplement d'ajouter les attributs lors de l'ajout des nœuds au graphique
G.add_node('abc', dob=1185, pob='usa', dayob='monday')
ou comme dictionnaire
G.add_node('abc', {'dob': 1185, 'pob': 'usa', 'dayob': 'monday'})
Pour accéder aux attributs, accédez-y simplement comme vous le feriez avec n'importe quel dictionnaire
G.node['abc']['dob'] # 1185
G.node['abc']['pob'] # usa
G.node['abc']['dayob'] # monday
Vous dites que vous souhaitez examiner les attributs des nœuds connectés. Voici un petit exemple sur la façon dont cela pourrait être accompli.
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.
Depuis networkx 2.0, G.edges_iter () a été remplacé par G.edges (). Cela s'applique également aux nœuds. Nous fixons data=True
pour accéder aux attributs. Le code est maintenant:
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.
De plus, vous n'avez pas à simplement attribuer les attributs lorsque le nœud est ajouté. Même après l'ajout, vous pouvez toujours les définir directement.
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'
Vous pouvez aussi utiliser set_node_attributes
( documentation ) qui vous permettra de définir un attribut pour plusieurs nœuds en même temps:
nx.set_node_attributes(G, 'cost', {1:3.5, 2:56})
G.node[1]['cost']
> 3.5
Des approches similaires peuvent être utilisées pour définir les attributs Edge.
Depuis networkx
v2.0, vous pouvez utiliser:
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}
Vous pouvez accéder à ce dictionnaire comme d'habitude:
{'abc': 1185}['abc']
> 1185