我的目标是编写一个程序,该程序以未连接的节点网络开头,每个节点可能具有相同或不同的属性。然后,如果节点具有共享属性,则将形成一条边。到目前为止,我已经浏览了network软件包,似乎没有一种简单的方法可以实现此目的。如果有人对如何做有任何想法,我将非常感谢您的帮助!
import networkx as nx
import matplotlib.pyplot as plt
import random
know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
G.add_node(i, knowledge = know_list[i-1])
#nx.draw(G)
#plt.show()
knowledge=nx.get_node_attributes(G, 'knowledge')
print(knowledge)
G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
print(awareness)`
#返回节点5的感知字典后的目标是将感知字典中的内容与知识字典进行比较(请注意,get_node_attributes返回一个字典,其中节点作为键,而Know_list中的元素作为项)。如果意识字典中的元素与节点的知识属性相同,则在两者之间添加一条边。例如,假设随机选择给出意识= [a,b]。在这种情况下,节点5将形成到节点1和2的连接,因为节点1具有[a]的知识,而节点2具有[b]的知识。但是,节点5将不会与节点3或4形成连接,因为它们不是意识字典中包含的元素。我希望这可以解决一些问题,让我知道它是否仍然令人困惑。
答案 0 :(得分:0)
从您共享的图表开始:
know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
G.add_node(i, knowledge = know_list[i-1])
nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')
您可以反转nx.get_node_attributes
属性的knowledge
返回的映射:
knowledge={j:i for i,j in nx.get_node_attributes(G, 'knowledge').items()}
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
# {5: ['b', 'a']}
然后通过遍历awareness
,您可以使用add_edge
在knowledge
中查找内部列表中的节点,从而轻松添加新边线:
for k,v in awareness.items():
for node in v:
G.add_edge(k,knowledge[node])
nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')