将csr_matrix转换为networkx图

时间:2014-07-10 16:22:53

标签: python sparse-matrix networkx

我在csr_matrix中有一个1000x1000稀疏矩阵(称为ppm),有39,000个非零元素。它是一个对称矩阵,所以我想将它转换为带有权重的networkx无向图。

如果我直接使用构造函数,则需要20.8秒才能创建此图形10次:

g = nx.Graph(ppm)

如果我使用以下代码,则需要9.1秒才能创建此图表10次:

nr_persons = ppm.shape[0]
g = nx.Graph()
g.add_nodes_from(range(nr_persons))

for i in range(nr_persons):
    for j in ppm.indices[ppm.indptr[i]:ppm.indptr[i+1]]:
        if i <= j:
            g.add_edge(i,j, weight = ppm[i,j])

对于我的应用程序,这太慢了,因为我想扩大规模。是否有另一种更快的方法可以从稀疏矩阵中创建图形?

PS。使用以下代码创建ppm:

N_rows = 1000
N_cols =  100
N_nonzero = 2000
m_rows = np.random.random_integers(0, N_rows-1, N_nonzero)
m_cols = np.random.random_integers(0, N_cols-1, N_nonzero)
m_data = np.random.random_integers(1, 10, N_nonzero)   
pam = csr_matrix( (m_data, (m_rows, m_cols)), shape=(N_rows, N_cols) )
ppm = pam.dot(csr_matrix.transpose(pam))

2 个答案:

答案 0 :(得分:2)

看起来像networkx有自己的函数从矩阵构造图形,你尝试过吗?它们更快吗?

from_numpy_matrix(A, create_using=None)

from_scipy_sparse_matrix(A, create_using=None, edge_attribute='weight')

答案 1 :(得分:2)

你能跳过构建矩阵吗?然后你可以使用

 G.add_weighted_edges_from(zip(m_cols,m_rows,m_data))

如果不是,您可以仍然在矩阵数据上使用相同的方法(add_weighted_edges_from)

ppm.nonzero()
ppm.data

这应该快得多。