Python networkX MultiDiGraph количество ребер - PullRequest
1 голос
/ 06 марта 2019

У меня есть направленный граф G типа MultiDiGraph из пакета networkx.

Номера ниже двух вызовов разные.Разве они не должны быть одинаковыми?

G.number_of_edges()

networkx.convert_matrix.to_scipy_sparse_matrix(G).nnz


К сожалению, я не могу воспроизвести эту проблему на небольших графиках, которые я создаю вручную, как показано в примере ниже, где два вызова печатают одно и то же число 5:

import networkx as nx
tmp = nx.MultiDiGraph([(0, 1), (1, 2), (2, 0), (1, 0), (3, 4)])

tmp.number_of_edges(): 5, nx.convert_matrix.to_scipy_sparse_matrix(tmp).nnz: 5

, в то время как здесь вывод для G:

G.number_of_edges(): 87780, nx.convert_matrix.to_scipy_sparse_matrix(G).nnz: 84242

G огроменграфик, который сгенерировал кто-то другой, и я не могу поделиться здесь

1 Ответ

1 голос
/ 06 марта 2019

A MultiDiGraph может иметь несколько ребер между одними и теми же двумя узлами.

Атрибут nnz scipy.sparse.csr_matrix возвращает количество непустых значений матрицы. Если граф имеет несколько ребер между двумя узлами, то значение nnz будет количеством соединенных узлов в каждом направлении, тогда как .number_of_edges() будет общим числом ребер в графе. Эти цифры будут разными!

Используйте значение .sum() для csr_matrix, если хотите получить общее количество ребер.

import networkx as nx
tmp = nx.MultiDiGraph([(0, 1), (1, 2), (2, 0), (1, 0), (3, 4)])
tmp.add_edge(3, 4)
tmp.add_edge(3, 4)
tmp.add_edge(3, 4)

nx_edge_count = tmp.number_of_edges()
scipy_nnz = nx.convert_matrix.to_scipy_sparse_matrix(tmp).nnz
scipy_edge_count = nx.convert_matrix.to_scipy_sparse_matrix(tmp).sum()

print("Number of edges: {}".format(nx_edge_count))
print("Number of non-zero matrix values: {}".format(scipy_nnz))
print("Sum of sparse matrix values: {}".format(scipy_edge_count))

Количество ребер: 8

Количество ненулевых значений матрицы: 5

Сумма значений разреженной матрицы: 8

...