2016-09-15 3 views
2

У меня есть матрица инцидентности (где строки являются узлами, а столбцы являются ребрами) следующим образом (это считывается из текстового файла в массив NumPy):Python NetworkX создания графы из матрицы инцидентности

[[1 1 1 1 1 1 1 1 1 1] 
[1 1 1 1 1 1 1 0 0 0] 
[1 1 1 1 1 0 1 1 0 0] 
[0 0 1 1 1 0 1 0 0 0] 
[1 1 1 1 1 1 0 0 0 0] 
[1 1 0 1 1 0 0 0 0 0] 
[1 0 1 0 0 1 0 1 0 0] 
[0 1 0 1 1 0 0 0 0 0] 
[1 1 1 0 0 1 0 0 0 0] 
[0 0 1 1 0 1 0 0 0 0] 
[1 0 1 0 0 1 0 0 0 0] 
[1 0 1 1 0 0 0 0 0 0] 
[1 0 0 0 0 0 1 1 0 0] 
[1 1 0 0 0 0 1 0 0 0] 
[0 1 0 0 0 1 0 0 0 0] 
[1 0 0 1 0 0 0 0 0 0] 
[0 0 1 1 0 0 0 0 0 0] 
[1 1 0 0 0 0 0 0 0 0] 
[0 1 0 0 0 0 0 0 0 0] 
[0 0 0 1 0 0 0 0 0 0] 
[1 0 0 0 0 0 0 0 0 0] 
[0 0 0 1 0 0 0 0 0 0] 
[0 1 0 0 0 0 0 0 0 0] 
[0 0 1 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 1 0 0 0] 
[0 1 0 0 0 0 0 0 0 0]] 

Я хотел бы создать граф, используя NetworkX из этой матрицы, но не смог найти, как это сделать. NetworkX from_numpy_matrix работает только с смежными матрицами. Here - хороший пример того, как создать матрицу инцидентов с помощью NetworkX (но это не мой случай, потому что у меня уже есть матрица инцидентов). Я также попытался this, но получил неприятную ошибку:

File "C:\Python27\lib\site-packages\networkx\convert.py", line 150, in to_networkx_graph 
    "Input is not a correct numpy matrix or array.") 
networkx.exception.NetworkXError: Input is not a correct numpy matrix or array. 

Выглядит простой вопрос, но, возможно, это не так. Может ли кто-нибудь помочь мне с этим?

Заранее благодарен!

ответ

5

Networkx имеет удобный nx.from_numpy_matrix function с матрицей смежности, поэтому, как только мы преобразуем матрицу инцидентности в матрицу смежности, мы хорошо.

Скажем, мы начнем с матрицы инцидентности

im = np.array([[0, 1, 1], [0, 1, 1], [0, 0, 0]]) 

Чтобы преобразовать его в матрицу смежности, сначала давайте посмотрим, какие подключены узлы:

am = (np.dot(im, im.T) > 0).astype(int) 

Здесь мы просто проверяем, если любые два узлы имеют по крайней мере одно ребро между ними.

Если вы хотите удалить самостоятельно петли, вы можете вызвать

np.fill_diagonal(am, 0) 

Давайте теперь посмотрим am:

>>> am 
array([[0, 1, 0], 
     [1, 0, 0], 
     [0, 0, 0]]) 

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

networkx.from_numpy_matrix(am) 
+0

Спасибо, @Ami Tavory! Я хорошо работаю. Трюк переноса исходной матрицы для создания матрицы смежности очень приятный. С наилучшими пожеланиями. – maurobio

Смежные вопросы