[실습] 인접 행렬
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>