NetworkX MultiDiGraph:向现有节点添加新属性

时间:2021-05-11 18:09:35

标签: python networkx

所以我在尝试 MultiDiGraph 时遇到了这种情况,希望得到一些指导:

G = nx.MultiDiGraph()
setA= ['a','b','c','d','e','f']
G.add_nodes_from(setA,entity='typeA')

setB = ['a','x','y','z']
G.add_nodes_from(setB,entity='typeB')
print([node[0] for node in G.nodes(data='entity') if node[1]=='typeA'])

显然,这会导致覆盖节点 'a' 的 'entity' 属性并打印 '['b', 'c', 'd', 'e', 'f']'

因为我怀疑这是故意的 在 NetworkX 方面,对于我想要实现的目标,是否有任何可行的解决方法?

非常感谢~

1 个答案:

答案 0 :(得分:0)

我同意@Νίκος Γιαλίτσης。 One-Hot Encoding 是一种普遍可行的方式。此外,networkx.MlutiDiGraph 数据是一个节点(或边元组)绑定了一个属性 dict,也就是说,任何 python dict 格式都有意义!例如:

G = nx.MultiDiGraph()
setA = ['a','b','c','d','e','f']
G.add_nodes_from(setA, entity={"typeA":True, "typeB":False})

# or
entityA = {"typeA":True, "typeB":False}
G.add_nodes_from(setA, entity=entityA)

attr = {"entity": entityA}  # or simply assign entityA to attr.
G.add_nodes_from(setA, **attr)

G.add_nodes_from(setA, entity=[True, False], entity_label=["typeA", "typeB"])
G.add_nodes_from(setA, entity=list(entityA.values()), entity_label=list(entityA.keys()))
……

那么问题仍然是如何获取每个节点类型的值。 (为每种类型设置二进制权重,并计算双向 Xor 可能是一个不错的选择。) PS:同样可以添加边缘属性。属性模式将展开为实体类型图的相邻矩阵。