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 матрицы? Или вы хотите, чтобы он использовался с графиком и networkx?

+0

Это потрясающе. Я понял, что мне нужно преобразовать свой список в 'scipy.sparse' или' numpy matrix', чтобы использовать networkx. Это было бы потрясающе, если бы я этого не сделал. Но я также хочу преобразовать его в нечто, которое легко переносится в «фреймворк данных» R, чтобы я мог использовать R. Две птицы с одним камнем. –

4

Вы можете конвертировать ваши узлы в индексы, используя np.unique:

>>> 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]]) 

Исходя из этого, вы можете сконструировать плотную матрицу смежности как:

>>> 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.]]) 

Или в разреженном формате, как:

>>> 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

Это было потрясающе. Благодаря! –

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