【问题标题】:Assigning Group ID to components in networkx将组 ID 分配给 networkx 中的组件
【发布时间】:2018-03-31 03:00:22
【问题描述】:

我有一个图表,它由具有酒店“parentid”的节点和存储在其中的“phone_search”组成。 我构建此图的主要目的是连接所有具有相似“phone_search”的“parentid”(递归),例如,如果 parentid A 具有 phone_search 1,2; B有2,3; C有3,4; D 有 5,6,E 有 6,7,那么 A、B、C 将被分到一个集群中,而 D 和 E 在另一个集群中。

这是我构建网络的代码:

from pymongo import MongoClient  # To import client for MongoDB
import networkx as nx
import pickle

G = nx.Graph()

#Defining variables
hotels = []
phones = []
allResult = []
finalResult = []

#dictNx = {}

# Initializing MongoDB client
client = MongoClient()

# Connection
db = client.hotel
collection = db.hotelData

for post in collection.find():
    hotels.append(post)

for hotel in hotels:
    try:
        phones = hotel["phone_search"].split("|")
        for phone in phones:
            if phone == '':
                pass
            else:
                G.add_edge(hotel["parentid"],phone)
    except:
        phones = hotel["phone_search"]
        if phone == '':
            pass
        else:
            G.add_edge(hotel["parentid"],phone)

# nx.write_gml(G,"export.gml")
pickle.dump(G, open('/home/justdial/newHotel/graph.txt', 'w'))

我想要做什么:我想为每个组件分配一个组 ID 并将其存储到字典中,以便我每次都可以直接从字典中轻松访问它们。

示例:Gid 1 将包含一些在同一个集群中的 parentid 和 phone_searches。同样,Gid 2 将包含来自另一个集群的节点,依此类推......

我还有一个疑问。使用组 ID 从字典中访问节点是否比在 networkx 图上执行 bfs 更快?

【问题讨论】:

    标签: python dictionary grouping networkx


    【解决方案1】:

    您基本上需要一个基于其组件(而不是集群)的节点列表,这相当简单。你需要connected_component_subgraphs()

    G = nx.caveman_graph(3, 4)  # generate example with 3 components of four members each
    components = nx.connected_component_subgraphs(G)
    
    comp_dict = {idx: comp.nodes() for idx, comp in enumerate(components)}
    print comp_dict
    # {0: [0, 1, 2, 3], 1: [4, 5, 6, 7], 2: [8, 9, 10, 11]}
    

    如果您希望组件 ID 作为节点属性:

    attr = {n: comp_id for comp_id, nodes in comp_dict.items() for n in nodes}
    
    nx.set_node_attributes(G, "component", attr)
    print G.nodes(data=True)
    # [(0, {'component': 0}), (1, {'component': 0}), (2, {'component': 0}), (3, {'component': 0}), (4, {'component': 1}), (5, {'component': 1}), (6, {'component': 1}), (7, {'component': 1}), (8, {'component': 2}), (9, {'component': 2}), (10, {'component': 2}), (11, {'component': 2})]
    

    【讨论】:

    • 我又遇到了一个问题。如您所见,在图中,我混合了“parentid”和“phone_search”。但我只想在字典中存储“parentid”,而不是“phone_search”。区分它们的一种方法是所有“phone_search”都是数字并且所有“parentid”都以“P”开头
    • 没有例子我不完全理解。但我相信这是一个不同的问题。还是这仍然与组件有关?
    • 在某种程度上,确实如此。在一个组件中,一些节点由 parentids 组成,一些是电话号码。但是当我将节点的值存储在字典中时,我只想存储以字母 P 开头的节点(在我的数据库中表示它是 parentid)。所以基本上,我想将组件的所有 parentid 节点存储在我的字典中,而不是 phone_search 的节点。
    • 我将添加一个示例来解决这个问题。假设一个组件有节点 P1、P2、P3、1、2、3。所以当我将这个连接的组件存储在字典中时,我只需要将 P1、P2 和 P3 存储在那里。它应该看起来像 {0: [P1, P2, P3],...}。
    • 从技术上讲,这个问题与组件无关。但仍然很容易:要么不添加它们,要么从图中删除它们(使用remove_nodes_from()),或者不将它们添加到comp_dict(通过检查@ 生成中的前导P 987654327@),或者从comp_dict 中删除它们(通过迭代值)。
    【解决方案2】:

    这是由于缺乏声誉而发表的评论。

    “set_node_attributes”函数更改了 v1.x 和 v2.0 之间的参数顺序,以允许更多选项来加载属性。 顺序是:(G, values, name) 而不是 (G, name, values)

    如果使用关键字参数,那么顺序并不重要:

    nx.set_node_attributes(G, name='component', values=attr)

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2021-05-12
      相关资源
      最近更新 更多