2014-01-30 102 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

您可以創建一個字典映射在你的元組爲整數的話,解析您的頻率的鍵元組,然後創建尺寸爲n×n,其中的numpy的陣列n是您擁有的單詞總數,最後使用您的頻率詞典填充該單詞。