2014-01-30 4 views
3

У меня есть очень большой словарь, содержащий кортежи как ключи и их значения. Этот словарь должен представлять матрицу смежности с векторами совпадения слов, например, «работа» появляется с «опытом» 16 раз, а «работа» появляется с «услугами» 15 раз. Независимо от того, является ли это предпочтительным методом хранения, другая проблема (с огромным количеством данных, которые у меня есть, вложенные словари стали кошмаром для обхода), но это просто то, что у меня есть сейчас.Преобразование словаря кортежей в матрицу numpy

Frequency:{ 
('work', 'experience'): 16, 
('work', 'services'): 25, 
('must', 'services'): 15, 
('data', 'services'): 10,  
... 
...} 

Благодаря предыдущему сообщению, я был в состоянии сделать простую бинарную матрицу смежности с NetworkX, просто с помощью этой методики:

A=Frequency.keys() 
networkx.Graph(A) 

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

array([[ 0., 16., 25., 0.], 
     [ 16., 0., 1., 0.], 
     [ 25., 1., 0., 1.], 
     [ 10., 0., 0., 0.] 
     ...) 

Прошу прощения, если это похоже на предыдущие сообщения, но я просто не могу найти правильный способ преобразования этих кортежей в матрицу, которую я могу использовать в NetworkX. Я предполагаю, что я буду использовать numpy, но я не могу найти документацию для такого метода.

Спасибо заранее,

Рон

ответ

4

This answer может быть полезен. С данными вашего образца:

>>> frequency = {('work', 'experience'): 16, 
...    ('work', 'services'): 25, 
...    ('must', 'services'): 15, 
...    ('data', 'services'): 10} 
>>> keys = np.array(frequency.keys()) 
>>> vals = np.array(frequency.values()) 
>>> keys 
array([['work', 'services'], 
     ['must', 'services'], 
     ['work', 'experience'], 
     ['data', 'services']], 
     dtype='|S10') 
>>> vals 
array([25, 15, 16, 10]) 
>>> unq_keys, key_idx = np.unique(keys, return_inverse=True) 
>>> key_idx = key_idx.reshape(-1, 2) 
>>> unq_keys 
array(['data', 'experience', 'must', 'services', 'work'], 
     dtype='|S10') 
>>> key_idx 
array([[4, 3], 
     [2, 3], 
     [4, 1], 
     [0, 3]]) 
>>> n = len(unq_keys) 
>>> adj = np.zeros((n, n) ,dtype=vals.dtype) 
>>> adj[key_idx[:,0], key_idx[: ,1]] = vals 
>>> adj 
array([[ 0, 0, 0, 10, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 15, 0], 
     [ 0, 0, 0, 0, 0], 
     [ 0, 16, 0, 25, 0]]) 
>>> adj += adj.T 
>>> adj 
array([[ 0, 0, 0, 10, 0], 
     [ 0, 0, 0, 0, 16], 
     [ 0, 0, 0, 15, 0], 
     [10, 0, 15, 0, 25], 
     [ 0, 16, 0, 25, 0]]) 
+0

Большое спасибо, человек. Ты помогаешь мне левым и правым. –

1

Вы можете создать словарь для отображения слов в ваших кортежах целых чисел, разбор кортежей в ключах вашей частоты, а затем создать Numpy массив размерности пХпа где n - общее количество слов, которые у вас есть, и, наконец, заполнить этот массив, используя частоту dict.

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