Как записать частный_граф результат в файл - PullRequest
2 голосов
/ 14 февраля 2020

Вот MWE для создания "проблемы"

>>> A = nx.complete_bipartite_graph(2, 3)
>>> same_neighbors = lambda u, v: (u not in A[v] and v not in A[u] and A[u] == A[v])
>>> B = nx.quotient_graph(A, same_neighbors)
>>> B.nodes()
NodeView((frozenset({0, 1}), frozenset({2, 3, 4})))
>>> B[frozenset({0, 1})]
AtlasView({frozenset({2, 3, 4}): {'weight': 6}})
>>> B.nodes[frozenset({0, 1})]
{'graph': <networkx.classes.graph.Graph object at 0x12b066e80>, 'nnodes': 2, 'nedges': 0, 'density': 0}

Я считаю, что этот атрибут graph на узле указывает подграф, из которого этот узел взят в исходном графе, но я Точно сказать не могу. Если бы кто-то мог проверить, что это было бы хорошо.

В любом случае, этот атрибут graph не позволяет мне использовать функцию nx.write_graphml, поскольку подграфы не могут использоваться в качестве форматов данных. В частности, это вызывает

networkx.exception.NetworkXError: GraphML writer does not support <class 'networkx.classes.graph.Graph'> as data values.

Теперь мне на самом деле не нужен подграф в файле graphml, поэтому просто удаление этих данных, вероятно, лучший способ для меня получить график, записанный в файл. Каков наилучший способ сделать это?

1 Ответ

2 голосов
/ 18 февраля 2020

Я считаю, что этот атрибут графа на узле указывает подграф, из которого этот узел взят в исходном графе, но я не уверен. Если бы кто-то мог проверить, что это было бы хорошо.

Да, вы правы , полагая, что атрибут graph фактически указывает подграф на основе исходного графа. Упоминается в документации для фактор-графа. Ознакомьтесь с описанием node_data, вы обнаружите, что:

node_data (function) – This function takes one argument, B, a set of
nodes in G, and must return a dictionary representing the node data
attributes to set on the node representing B in the quotient graph. If
None, the following node attributes will be set:

- graph, the subgraph of the graph G that this block represents,
- nnodes, the number of nodes in this block,
- nedges, the number of edges within this block,
- density, the density of the subgraph of G that this block represents.

Вы также можете проверить подграф самостоятельно, набрав

for node in B.nodes():
    print("Information for subgraph ", node)
    print(B.nodes[node]['graph'].nodes())

# Output:
# Information for subgraph  frozenset({0, 1})
# Nodes are  [0, 1]
# Information for subgraph  frozenset({2, 3, 4})
# Nodes are  [2, 3, 4]

Теперь я не На самом деле нужен подграф в файле graphml, поэтому просто удаление этих данных, вероятно, лучший способ для меня записать график в файл. Каков наилучший способ сделать это?

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

Давайте проверим EdgeView факторного графа, прежде чем идти дальше:

B.edges(data=True)
# EdgeDataView([(frozenset({0, 1}), frozenset({2, 3, 4}), {'weight': 6})])

Обратите внимание, что data для края это словарь с weight в качестве ключа. Эта информация будет полезен в следующем коде.

Теперь создайте новый граф и добавьте ребра непосредственно из фактор-графа.

H = nx.Graph()

# Here B is the quotient graph
for u,v,d in B.edges(data=True):
    # Notice how the weight is assigned to the new graph
    H.add_edge(u, v, weight=d['weight'])

Если вы хотите убедиться, что новый граф имеет ту же структуру, вы можете проверить это, используя nx.is_isomorphi c

nx.is_isomorphic(H, B)
# True

Теперь вы можете просто написать свой график в формате GraphML

nx.readwrite.graphml.write_graphml(H, "my_graph.graphml")

Для получения дополнительной информации вы можете этот Google Colab Notebook , с вышеуказанным рабочим кодом.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...