Упорядоченные узлы в матрице смежности при использовании nx.to_numpy_array - PullRequest
1 голос
/ 17 июня 2020

Я создаю граф с некоторыми ребрами:

import networkx as nx

g = nx.Graph()
g.add_edge(1, 2)
g.add_edge(2, 6)
g.add_edge(3, 4)
g.add_edge(5, 6)

print(g.edges)
output-> (1, 2), (1, 5), (2, 6), (5, 6), (3, 4)

А затем получаю смежный A, используя граф g

nx.convert_matrix.to_numpy_array(g)

Результат :

array([[0., 1., 1., 0., 0., 0.],
       [1., 0., 0., 1., 0., 0.],
       [1., 0., 0., 1., 0., 0.],
       [0., 1., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1., 0.]])

Вы можете увидеть, что соседние элементы не совпадают g, если вы рассматриваете индексы соседних элементов следующим образом:

A :   1 2 3 4 5 6
     —————————————
  1 | 0 1 1 0 0 0
  2 | 1 0 0 1 0 0
  3 | 1 0 0 1 0 0
  4 | 0 1 1 0 0 0
  5 | 0 0 0 0 0 1
  6 | 0 0 0 0 1 0

Например:

На A значение индексов (1, 3) равно 1 , как обычно, что означает, что ребра (1, 3) существуют, но на самом деле нет!

Если я изменю индексы A на это, как показано ниже:

A :   1 2 5 6 3 4
     —————————————
  1 | 0 1 1 0 0 0
  2 | 1 0 0 1 0 0
  5 | 1 0 0 1 0 0
  6 | 0 1 1 0 0 0
  3 | 0 0 0 0 0 1
  4 | 0 0 0 0 1 0

, совпадение будет прямо между edges и A.

Мой вопрос

Как сделать так, чтобы индексы A следовали нормальному порядку -> 1,2,3,4 ...

Заранее спасибо ~

1 Ответ

1 голос
/ 17 июня 2020

Порядок, в котором узлы появляются в результате to_numpy_matrix, зависит от порядка вставки ребер, который является порядком, в котором узлы добавляются к графу. Вы можете проверить фактический порядок матрицы смежности с помощью nx.to_pandas_adjacency:

g = nx.Graph()
g.add_edge(1, 2)
g.add_edge(2, 6)
g.add_edge(3, 4)
g.add_edge(5, 6)
g.edges()
# EdgeView([(1, 2), (2, 6), (6, 5), (3, 4)])

nx.to_pandas_adjacency(g)

     1    2    6    3    4    5
1  0.0  1.0  0.0  0.0  0.0  0.0
2  1.0  0.0  1.0  0.0  0.0  0.0
6  0.0  1.0  0.0  0.0  0.0  1.0
3  0.0  0.0  0.0  0.0  1.0  0.0
4  0.0  0.0  0.0  1.0  0.0  0.0
5  0.0  0.0  1.0  0.0  0.0  0.0

Чтобы получить матрицу смежности с упорядоченными узлами, вы можете использовать параметр nodelist в nx.to_numpy_matrix и передайте ему отсортированный список узлов:

nx.to_numpy_matrix(g, nodelist=sorted(g.nodes()))

matrix([[0., 1., 0., 0., 0., 0.],
        [1., 0., 0., 0., 0., 1.],
        [0., 0., 0., 1., 0., 0.],
        [0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 1., 0.]])

То же самое, что вы получили бы, переиндексируя оси в кадре данных смежности:

nodes_sorted = sorted(g.nodes())
nx.to_pandas_adjacency(g).reindex(index=nodes_sorted, columns=nodes_sorted)

    1    2    3    4    5    6
1  0.0  1.0  0.0  0.0  0.0  0.0
2  1.0  0.0  0.0  0.0  0.0  1.0
3  0.0  0.0  0.0  1.0  0.0  0.0
4  0.0  0.0  1.0  0.0  0.0  0.0
5  0.0  0.0  0.0  0.0  0.0  1.0
6  0.0  1.0  0.0  0.0  1.0  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...