将csr_matrix转换为networkx图
我有一个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
这样应该会快很多。