Взвешенная бимодальная проекция двудольного графа с сохранением исходных весов

У меня есть большой ( 36k вершин, 50k ребер) взвешенный бимодальный двудольный граф, и я хотел бы создать проекцию, которая не только подсчитывает соседей, как взвешенная реализация по умолчанию, но и суммирует веса на ребрах. Вы можете думать о нем как о двудольном графе, содержащем черные вершины и синие вершины, где я хочу сохранить исходные веса графа, когда есть только синие вершины.

Реализации, с которыми я сталкивался, сохраняют значение оранжевого цвета, я интересуюсь красным (или, надеюсь, получим двунаправленную проекцию).

Я до сих пор смотрел на igraph, networkx и python-tool, но до сих пор я наблюдал только проекцию, подсчитывающую количество ребер.

Метод Networkx generic_weighted_projected_graph(B, node, weight_function=None) может сделать это жизнеспособным, но я не понимаю, как это сделать (sna является новым для меня, хотя я и так питонский пользователь).

1 ответ

Решение

В документации, на которую вы ссылаетесь по адресу https://networkx.github.io/documentation/latest/reference/generated/networkx.algorithms.bipartite.projection.generic_weighted_projected_graph.html есть пример того, как именно это сделать.

Это выглядит так:

import networkx as nx
from networkx.algorithms import bipartite

edges = [('A1','B1',3),
         ('A1','B2',7),
         ('A2','B1',2),
         ('A2','B2',4),
         ]

B = nx.Graph()
B.add_weighted_edges_from(edges)

def my_weight(G, u, v, weight='weight'):
    w = 0
    for nbr in set(G[u]) & set(G[v]):
        w += G.edge[u][nbr].get(weight, 1) + G.edge[v][nbr].get(weight,1)
    return w

G = bipartite.generic_weighted_projected_graph(B, ['A1', 'A2'], weight_function=my_weight)


print G.edges(data=True)

выход

[('A1', 'A2', {'weight': 16})]
Другие вопросы по тегам