如何在NetworkX的MultiDiGraph中无需循环为每条边应用函数?
给MultiDiGraph的边批量应用函数(无需显式循环)
不用把图转成DataFrame,NetworkX本身就有办法实现类似pandas apply()的批量边处理,下面是两种实用方法:
方法一:字典推导 + nx.set_edge_attributes
利用NetworkX的set_edge_attributes方法,配合字典推导式批量生成处理后的边属性,代码层面不用写循环:
import networkx as nx # 示例MultiDiGraph G = nx.MultiDiGraph() G.add_edge(1, 2, key=0, weight=3) G.add_edge(1, 2, key=1, weight=5) G.add_edge(2, 3, key=0, weight=2) # 定义要应用到边的函数 def process_weight(weight): return weight ** 2 # 生成处理后的属性字典,键是边的(u, v, key)三元组,值是函数结果 processed_attrs = {(u, v, k): process_weight(d['weight']) for u, v, k, d in G.edges(data=True, keys=True)} # 批量设置新属性 nx.set_edge_attributes(G, processed_attrs, 'weight_squared')
这里G.edges(data=True, keys=True)会返回所有边的完整信息(节点对、边key、属性字典),字典推导式遍历这些条目并应用函数,最后一次性把结果设置到图中。
方法二:map函数 + 字典转换
用map函数对每条边的属性做批量处理,再转换成字典后设置:
# 用map批量处理每条边 processed_edges = map(lambda e: (e[0], e[1], e[2], process_weight(e[3]['weight'])), G.edges(data=True, keys=True)) # 转换为符合要求的属性字典 processed_attrs = {(u, v, k): val for u, v, k, val in processed_edges} nx.set_edge_attributes(G, processed_attrs, 'weight_squared')
这两种方式都没有显式的for循环,和pandas的apply()逻辑一致,都是对每个元素批量应用函数,而且不用额外转换数据结构。
内容的提问来源于stack exchange,提问作者Holan
相关产品推荐
相关产品推荐

