【发布时间】:2022-01-21 17:57:29
【问题描述】:
我有一个加权无向简单图。
节点数在数万左右,边数也是如此(它是一个稀疏图/矩阵)。
对于每个节点,我想找到最大边权重(“最大分数”)并将其与共享该边的节点一起存储在数据框中。数据框将包含三列:node_name - str、max_score - float [0-1]、max_score_nodes - List[str]
下面提供了我当前的解决方案,但它并不优雅,在 for 循环中有多个列表解析(其中一个是嵌套的),检查没有边的节点等,我觉得有一种更聪明的方法来做到这一点。
import string
import igraph as ig
import numpy as np
import pandas as pd
nodes = list(string.ascii_letters[0:6].upper())
edges = [("A", "F"), ("A", "C"), ("F", "D"), ("D", "C"), ("D", "E")]
weights = [0.6, 0.4, 0.3, 0.9, 0.9]
w_graph = ig.Graph(directed=False)
w_graph.add_vertices(nodes)
w_graph.add_edges(edges, {"weight": weights})
records = {}
for node in nodes:
local_edges = np.array(w_graph.vs.find(node).all_edges())
if local_edges.size == 0:
records.update({node: {"max_score": 0, "max_score_nodes": np.nan}})
continue
local_weights = [local_edge["weight"] for local_edge in local_edges]
max_score = np.max(local_weights)
max_score_ind = np.where(local_weights == max_score)[0]
max_score_edges = local_edges[max_score_ind]
vertex_tuples = [edge.vertex_tuple for edge in max_score_edges]
max_score_nodes = [
[vertex["name"] for vertex in vertex_tuple if vertex["name"] != node][0] for
vertex_tuple in vertex_tuples]
records.update({node: {"max_score": max_score, "max_score_nodes": max_score_nodes}})
output = pd.DataFrame.from_dict(records, orient="index")
output_with_node_name = output.rename_axis("node_name").reset_index()
print(output_with_node_name)
【问题讨论】:
标签: python pandas scipy igraph