将一个元组字典转换成numpy矩阵

5

我有一个非常大的字典,其中包含元组作为键和它们的值。这个字典应该表示一个邻接矩阵,其中包含单词共现向量,例如'work'与'experience'共现16次,'work'与'services'共现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,但我找不到任何关于这样的方法的文档。

提前致谢,

Ron

2个回答

5
这篇答案可能会有所帮助,与您的示例数据相关:

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

这是一个很棒的答案。只需要在第5和6行使用list()将字典的键和值转换为列表即可。 - oy321

1
你可以创建一个字典,将元组中的单词映射到整数上,在解析 Frequency 键中的元组时使用该字典,并创建一个维度为 nxn 的 numpy 数组,其中 n 是您拥有的单词总数,最后使用 Frequency 字典填充该数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接