将csr_matrix转换为networkx图

1 投票
2 回答
1296 浏览
提问于 2025-04-18 12:49

我有一个1000x1000的稀疏矩阵(叫做ppm),里面有39000个非零元素。这个矩阵是对称的,所以我想把它转成一个带权重的无向图,使用networkx库。

如果我直接用构造函数来创建这个图,创建10次需要20.8秒:

g = nx.Graph(ppm)

但如果我用下面的代码,创建10次只需要9.1秒:

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

不过,对我来说,这个速度还是太慢了,因为我想要扩展应用。有没有更快的方法可以从稀疏矩阵创建图?

另外,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 个回答

3

看起来networkx有自己的函数,可以从矩阵构建图形,你试过这些吗?它们快吗?

from_numpy_matrix(A, create_using=None)

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

2

你能跳过构建矩阵的步骤吗?那你可以使用

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

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

ppm.nonzero()
ppm.data

这样应该会快很多。

撰写回答