Python使用igraph创建二分图触发TypeError报错问题求助
问题原因分析
你遇到的报错核心有两个诱因:
- 边ID与类型列表不匹配
igraph的Bipartite构造方法默认要求边列表传入的是从0开始的连续整数节点ID,且types参数的长度必须和节点总数一致、顺序与节点ID顺序严格对应。你当前的边列表用的是业务原始ID,既不是连续整数,也没有和你构造的types列表顺序对齐,igraph无法识别这类ID才抛出类型转换错误。 - 代码存在语法疏漏:
t.append(str('id_inc_ue')缺少右括号,运行时也会触发语法报错。
关于你提到的「先建普通图再加类型属性」的方案是完全可行的,igraph的二分图本质就是附带type布尔属性的普通图,只要保证同一类型节点之间没有边,就是合法二分图。
修复方案
方案1:规范调用Graph.Bipartite构造方法
import igraph as ig # 1. 统一收集所有节点并标记类型 node_type = {} for _, row in edges_inc.iterrows(): prov_id = row['id_proveedor'] ue_id = row['id_inc_ue'] if prov_id not in node_type: node_type[prov_id] = 0 # 供应商类标记为0 if ue_id not in node_type: node_type[ue_id] = 1 # 机构类标记为1 # 2. 生成连续节点ID映射 node_list = list(node_type.keys()) type_list = list(node_type.values()) id_map = {node: idx for idx, node in enumerate(node_list)} # 3. 转换边列表为连续整数ID格式 edge_list = [(id_map[row['id_proveedor']], id_map[row['id_inc_ue']]) for _, row in edges_inc.iterrows()] # 4. 构造二分图 g_buy = ig.Graph.Bipartite(type_list, edges=edge_list, directed=True) # 给节点绑定原始业务ID,方便后续查询 g_buy.vs["name"] = node_list
方案2:先建普通图再补类型属性
# 直接用业务ID构造普通有向图 g_buy = ig.Graph.TupleList(edges_inc[['id_proveedor','id_inc_ue']].itertuples(index=False), directed=True) # 给节点打类型标记 prov_set = set(edges_inc['id_proveedor']) for v in g_buy.vs: v['type'] = 0 if v['name'] in prov_set else 1 # 可调用以下方法验证是否为合法二分图,返回True即符合要求 print(g_buy.is_bipartite())
内容的提问来源于stack exchange,提问作者Ana Sofia Samaniego Bisio
相关产品推荐
相关产品推荐

