将元组字典转换为numpy矩阵

时间:2014-01-30 01:42:57

标签: python dictionary numpy matrix networkx

我有一个非常大的字典,其中包含元组作为键及其值。该词典应该表示具有单词共现向量的邻接矩阵,例如“工作”出现“经验”16次,“工作”出现“服务”出现15次。这是否是首选存储方法是另一个问题(我拥有大量数据,嵌套字典成为遍历的噩梦),但它正是我现在所拥有的。

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,但我找不到像这样的方法的任何文档。

提前致谢,

罗恩

2 个答案:

答案 0 :(得分: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]])

答案 1 :(得分:1)

你可以创建一个字典来将元组中的单词映射到整数,解析Frequency键中的元组,然后创建一个nint n维数组,其中n是你拥有的单词总数,最后填写使用频率字典的数组。

相关问题