我在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))
答案 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
这应该快得多。