web-dev-qa-db-fra.com

Stockage et accès aux attributs de noeud python networkx

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 xyzdob=1185, le lieu de naissance de xyzpob=usa, et le jour de naissance de xyzdayob=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 dobs respectifs, leurs pobs et leurs dayobs

37
user1295112

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.
43
Maehler

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.

22
Joel

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
6
severinsimmler