【问题标题】:Efficiently create adjacency matrix from network graph (vice versa) Python NetworkX从网络图有效地创建邻接矩阵(反之亦然)Python NetworkX
【发布时间】:2015-11-18 06:27:57
【问题描述】:

我正在尝试创建网络图并从中生成稀疏矩阵。从维基百科Laplacian matrix 示例中,我决定尝试使用networkx 重新创建以下网络图

如何有效地在adjacency matrixnetwork graph 之间进行转换?

例如,如果我有一个网络图,如何快速将其转换为邻接矩阵,如果我有一个邻接图,如何有效地将其转换为网络图。

下面是我的代码,我觉得对于大型网络来说效率很低。

#!/usr/bin/python

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import pandas as pd

%matplotlib inline

#Adjacent matrix
adj_matrix = np.matrix([[0,1,0,0,1,0],[1,0,1,0,1,0],[0,1,0,1,0,0],[0,0,1,0,1,1],[1,1,0,1,0,0],[0,0,0,1,0,0]])
adj_sparse = sp.sparse.coo_matrix(adj_matrix, dtype=np.int8)
labels = range(1,7)
DF_adj = pd.DataFrame(adj_sparse.toarray(),index=labels,columns=labels)
print DF_adj

#   1  2  3  4  5  6
#1  0  1  0  0  1  0
#2  1  0  1  0  1  0
#3  0  1  0  1  0  0
#4  0  0  1  0  1  1
#5  1  1  0  1  0  0
#6  0  0  0  1  0  0

#Network graph
G = nx.Graph()
G.add_nodes_from(labels)

#Connect nodes
for i in range(DF_adj.shape[0]):
    col_label = DF_adj.columns[i]
    for j in range(DF_adj.shape[1]):
        row_label = DF_adj.index[j]
        node = DF_adj.iloc[i,j]
        if node == 1:
            G.add_edge(col_label,row_label)


#Draw graph
nx.draw(G,with_labels = True)

#DRAWN GRAPH MATCHES THE GRAPH FROM WIKI

#Recreate adjacency matrix
DF_re = pd.DataFrame(np.zeros([len(G.nodes()),len(G.nodes())]),index=G.nodes(),columns=G.nodes())
for col_label,row_label in G.edges():
    DF_re.loc[col_label,row_label] = 1
    DF_re.loc[row_label,col_label] = 1
print G.edges()
#[(1, 2), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5), (4, 6)]

print DF_re
#   1  2  3  4  5  6
#1  0  1  0  0  1  0
#2  1  0  1  0  1  0
#3  0  1  0  1  0  0
#4  0  0  1  0  1  1
#5  1  1  0  1  0  0
#6  0  0  0  1  0  0

【问题讨论】:

    标签: python matrix graph network-programming networkx


    【解决方案1】:

    如何从图转换为邻接矩阵:

    import scipy as sp
    import networkx as nx
    G=nx.fast_gnp_random_graph(100,0.04)
    adj_matrix = nx.adjacency_matrix(G)
    

    这是documentation

    从邻接矩阵到图:

    H=nx.Graph(adj_matrix)  #if it's directed, use H=nx.DiGraph(adj_matrix)
    

    这是documentation

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,并找到了解决方案。 我们可以使用函数from_numpy_matrix,在官网http://networkx.github.io/documentation/networkx-1.7/reference/generated/networkx.convert.from_numpy_matrix.html中有描述。 注意输入数据通常需要通过 numpy.matrix() 进行修改。 给出的例子是:

          import numpy
          A=numpy.matrix([[1,1],[2,1]])
          G=nx.from_numpy_matrix(A)
      

      真的很有用。

      【讨论】:

        猜你喜欢
        • 2022-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        相关资源
        最近更新 更多