Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从python中的字典生成图的邻接矩阵?_Python_Python 3.x_Dictionary_Matrix_Adjacency Matrix - Fatal编程技术网

如何从python中的字典生成图的邻接矩阵?

如何从python中的字典生成图的邻接矩阵?,python,python-3.x,dictionary,matrix,adjacency-matrix,Python,Python 3.x,Dictionary,Matrix,Adjacency Matrix,我有以下字典: g = { 'A': ['A', 'B', 'C'], 'B': ['A', 'C', 'E'], 'C': ['A', 'B', 'D'], 'D': ['C','E'], 'E': ['B','D'] } 它实现一个图,每个列表包含图顶点的邻居(字典键是顶点本身)。 我遇到了麻烦,我想不出一个方法来从他们的邻域列表中获得一个图邻接矩阵,可能很容易,但我是python新手,希望有人能帮助我!我正在使用Python 3.5 我需要生成以下矩阵: 这里有一个使用熊猫的解决方案

我有以下字典:

g = {
'A': ['A', 'B', 'C'], 
'B': ['A', 'C', 'E'], 
'C': ['A', 'B', 'D'],
'D': ['C','E'],
'E': ['B','D']
}
它实现一个图,每个列表包含图顶点的邻居(字典键是顶点本身)。 我遇到了麻烦,我想不出一个方法来从他们的邻域列表中获得一个图邻接矩阵,可能很容易,但我是python新手,希望有人能帮助我!我正在使用Python 3.5

我需要生成以下矩阵:


这里有一个使用熊猫的解决方案

import pandas as pd

g = {
'A': [ 'A', 'B', 'C'], 
'B': [ 'A', 'C', 'E'], 
'C': [ 'A', 'B ',' D '], # I added a comma here
'D': [' C ',' E '],
'E': [' B ',' D ']
}

# clean up the example
g = {k: [v.strip() for v in vs] for k, vs in g.items()}

edges = [(a, b) for a, bs in g.items() for b in bs]

df = pd.DataFrame(edges)

adj_matrix = pd.crosstab(df[0], df[1])

# 1  A  B  C  D  E
# 0               
# A  1  1  1  0  0
# B  1  0  1  0  1
# C  1  1  0  1  0
# D  0  0  1  0  1
# E  0  1  0  1  0
我不知道为什么示例矩阵中有2个处于(A,A)位置。

没有熊猫

keys=sorted(g.keys())
size=len(keys)

M = [ [0]*size for i in range(size) ]

for a,b in [(keys.index(a), keys.index(b)) for a, row in g.items() for b in row]:
     M[a][b] = 2 if (a==b) else 1

M

[2, 1, 1, 0, 0],
[1, 0, 1, 0, 1],
[1, 1, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 1, 0, 1, 0]]
解释

对于a,g.items()中的行。
迭代字典中的key:value条目,对于b,行中的
迭代值。如果我们使用(a,b),这会给我们所有的对

(键索引(a)、键索引(b))
但是我们需要将索引分配给相应的矩阵项

keys=sorted(g.keys())
这就是我们提取和排序键的原因

对于…中的a,b
获取索引项,并根据对角线元素是否分配值1或2

M=[[0]*用于……的大小

初始化前不能使用矩阵。

键/值中的额外空格是有意的吗?您想如何访问结果?嵌套列表可以吗?如果可以,是否希望列表按字母顺序排列?(字典中的键不保证顺序。)不,空格是偶然出现的,我将编辑问题以解决此问题!我可以使用:sorted(g)获得排序键我相信在这个加权图中,指向自身的节点的权重为2。这只是一个假设。2是因为顶点“a”本身有一条边。我无法导入熊猫。导入错误:没有名为“熊猫”的模块您需要安装熊猫,或者使用不同的方法。请参阅此处关于矩阵的内容:我们可以计算出在前两种情况下,(A,A)指出一点,在第三种情况下,矩阵的其余部分应该加倍。如果我遗漏了什么,请告诉我。@Yakym Pirozhenko谢谢你的解决方案。我有一个巨大的数据集,需要4米的列和1米的行来生成adj_矩阵。所以我在服务器上收到MemoryError。你有什么解决方案吗?很好,你帮了我很多忙!但是你能帮我吗向我解释这段代码?我不太理解填充数组的循环行,我知道你使用了“python理解”,但这对我来说很复杂,我是python新手,非常感谢!谢谢你的解释!现在看起来太简单了!
import numpy as np
mat = np.zeros(shape = (len(g), len(g)))
for k, vs in g.items():
    for v in vs:
        if v in g[k]:
            mat[k][v] = 1