[실습] 인접 행렬 :: Python 네트워크 분석 - mindscale
Skip to content

[실습] 인접 행렬

import networkx as nx

그래프 -> 인접 행렬

다음과 같은 그래프가 있다고 해보자.

D1 = nx.DiGraph()
D1.add_edges_from([(1, 2), (1, 3), (3, 2)])
nx.draw(D1, with_labels=True, node_color='white')

위의 그래프를 인접 행렬로 변환하려면 아래와 같이 한다.

nx.to_numpy_array(D)
array([[0., 1., 1.],
       [0., 0., 0.],
       [0., 1., 0.]])

인접 행렬 -> 무방향 그래프

인접 행렬로부터 그래프를 만들 때는 다음과 같이 한다.

import numpy as np
M = np.array([
    [0, 0, 1],
    [0, 0, 1],
    [0, 0, 0],
])
G = nx.from_numpy_array(M)
nx.draw(G, with_labels=True, node_color='white')

인접 행렬 -> 방향 그래프

방향 그래프로 변환하려면 아래와 같이 한다.

D2 = nx.from_numpy_array(M, create_using=nx.DiGraph)
nx.draw(D2, with_labels=True, node_color='white')

희박 행렬

그래프가 커지면 대부분의 노드들은 서로 연결되지 않기 때문에 인접 행렬의 대부분 원소가 0이 된다. 이 경우 용량을 줄이기 위해 일반 행렬 대신 CSR이라는 압축된 형식의 행렬로 변환할 수 있다.

S = nx.to_scipy_sparse_matrix(D)

압축된 행렬에서 그래프로 변환할 때는 다음과 같이 한다.

nx.from_scipy_sparse_matrix(S)
<networkx.classes.graph.Graph at 0x1bdb72d8be0>