通过将网络节点的属性与字典进行比较来定义这些属性



我有一个.gml文件,如下所示:

graph [
directed 1
node [
id 0
label "5B5F2C071D12AF13219DF5EBE05132AF"
]
node [
id 1
label "9FB3B96B6D5E16C9DD564AA3E84F1954"
]
node [
id 2
label "B3299B0E587D7275E3E4D530E9EECF50"
]
node [
id 3
label "6432F1DF21BA38368D9A165C739EEBB3"
]
node [
id 4
label "85D5C50A6D882CA8E4BB00BCA3574417"
]
node [
id 5
label "0D8583F810B9720A8032BB939F12B3FF"
]
node [
id 6
label "6C10A9E9F325CAA3CCB7F9A0D6983D2A"
]
node [
id 7
label "B0C50ED1DEC9E06E4C64E7419DDC4B09"
]
]

我需要在网络的每个节点上添加一个名为class的属性,它代表一个社会经济分类。我有一个字典,包含节点id和类,如下所示:

dict_users = {"5B5F2C071D12AF13219DF5EBE05132AF": 3,
"9FB3B96B6D5E16C9DD564AA3E84F1954": 2,
"B3299B0E587D7275E3E4D530E9EECF50": 3,
"6432F1DF21BA38368D9A165C739EEBB3": 2,
"85D5C50A6D882CA8E4BB00BCA3574417": 3,
"0D8583F810B9720A8032BB939F12B3FF": 2,
"6C10A9E9F325CAA3CCB7F9A0D6983D2A": 3,
"B0C50ED1DEC9E06E4C64E7419DDC4B09": 2}

但是,当我通过字典遍历网络时,所有节点都会收到字典中最后一个节点的值。以下是完整的代码:

import pandas as pd
import networkx as nx
G = nx.read_gml('/home/gustavo/Desktop/Mestrado/mestrado_dados/Redes/Teste.gml')
dict_users = {"5B5F2C071D12AF13219DF5EBE05132AF": 3,
"9FB3B96B6D5E16C9DD564AA3E84F1954": 2,
"B3299B0E587D7275E3E4D530E9EECF50": 3,
"6432F1DF21BA38368D9A165C739EEBB3": 2,
"85D5C50A6D882CA8E4BB00BCA3574417": 3,
"0D8583F810B9720A8032BB939F12B3FF": 2,
"6C10A9E9F325CAA3CCB7F9A0D6983D2A": 3,
"B0C50ED1DEC9E06E4C64E7419DDC4B09": 3}
for i in G.nodes:
for j in dict_users.keys():
if i == j:
nx.set_node_attributes(G, dict_users.get(j), 'class')

有人能告诉我应该怎么做吗?这样每个节点都能像字典中一样接收对应的值?此外,有没有什么方法可以降低网络和字典之间的迭代计算成本?真正的.gml文件要大得多,字典也是如此。

我找到了一个答案,但它在计算上仍然非常昂贵:

import pandas as pd
import networkx as nx
G = nx.read_gml('/home/gustavo/Desktop/Mestrado/mestrado_dados/Redes/Teste.gml')
dict_users = {"5B5F2C071D12AF13219DF5EBE05132AF": 3,
"9FB3B96B6D5E16C9DD564AA3E84F1954": 2,
"B3299B0E587D7275E3E4D530E9EECF50": 3,
"6432F1DF21BA38368D9A165C739EEBB3": 2,
"85D5C50A6D882CA8E4BB00BCA3574417": 3,
"0D8583F810B9720A8032BB939F12B3FF": 2,
"6C10A9E9F325CAA3CCB7F9A0D6983D2A": 3,
"B0C50ED1DEC9E06E4C64E7419DDC4B09": 3}
for i in G.nodes:
for j in dict_users.keys():
if i == j:
G.nodes[i]['class'] = dict_users.get(j)

最新更新