2014-01-24 2 views
2

매우 큰 튜플 목록을 통해 인접 행렬을 나타내려고합니다. 이 목록을 numpy 행렬이나 scipy.sparse 행렬로 표현하면 igraph 나 networkx와 같은 패키지를 사용할 수 있습니까? 이 중복 된 경우비 숫자 튜플을 numpy 행렬로 변환

[('b', 'c'), 
('b', 'a'), 
('c', 'd'), 
('c', 'a'), 
('c', 'b'), 
('a', 'b'), 
('a', 'c')] 

나는 사과,하지만 난 인접 행렬에 숫자가 아닌 튜플을 변환하는 방법에 대한 문서를 찾을 수 없습니다.

답변

2

NetworkX는 숫자가 아닌 노드를 가질 수 있습니다. 내가 제대로 질문을 이해 해요, 당신이뿐만 쉽게 networkx 그래프에서 사용할 수 있습니다 :

import networkx as nx 
g = nx.Graph([('a', 'b'), ('c', 'd'), ...]) 

당신이 어떻게 scipy.sparse 또는 numpy 행렬에 그 변환을 요청하고 있습니까? 또는 그래프 및 네트워크 x와 함께 사용 하시겠습니까?

+0

정말 대단합니다. 필자는 networkx를 사용하기 위해 목록을'scipy.sparse' 또는 numpy 행렬로 변환해야한다고 생각했다. 내가 그렇게하지 않으면 놀랄 것입니다. 그러나 나는 또한 이것을'R dataframe'으로 쉽게 옮길 수있는 것으로 변환하기를 원하므로 R을 사용할 수도 있습니다. 한 돌 종류의 두 마리. –

4

당신은 np.unique를 사용하여 인덱스로 노드를 변환 할 수 있습니다

>>> adj_matrix = np.zeros((len(node_names),)*2) 
>>> adj_matrix[adj_idx[:, 0], adj_idx[:, 1]] = 1 
>>> adj_matrix 
array([[ 0., 1., 1., 0.], 
     [ 1., 0., 1., 0.], 
     [ 1., 1., 0., 1.], 
     [ 0., 0., 0., 0.]]) 

또는 스파 스 형식 :이에서

>>> adj = [('b', 'c'), 
...  ('b', 'a'), 
...  ('c', 'd'), 
...  ('c', 'a'), 
...  ('c', 'b'), 
...  ('a', 'b'), 
...  ('a', 'c')] 
>>> node_names, adj_idx = np.unique(adj, return_inverse=True) 
>>> node_names 
array(['a', 'b', 'c', 'd'], 
     dtype='|S1') 
>>> adj_idx = adj_idx.reshape(-1, 2) 
>>> adj_idx 
array([[1, 2], 
     [1, 0], 
     [2, 3], 
     [2, 0], 
     [2, 1], 
     [0, 1], 
     [0, 2]]) 

, 당신이 당신의 밀도가 인접 행렬을 구성 할 수 있습니다로

>>> sps_adj_mat = sps.coo_matrix((np.ones(shape=(len(adj_idx),)), 
...        (adj_idx[:, 0], adj_idx[:, 1])), 
...        shape=(len(node_names),)*2) 
>>> sps_adj_mat 
<4x4 sparse matrix of type '<type 'numpy.float64'>' 
    with 7 stored elements in COOrdinate format> 
>>> sps_adj_mat.A 
array([[ 0., 1., 1., 0.], 
     [ 1., 0., 1., 0.], 
     [ 1., 1., 0., 1.], 
     [ 0., 0., 0., 0.]]) 
+0

이것은 굉장했습니다. 감사! –

관련 문제