使用Python将邻接表转换为稀疏邻接矩阵

4
使用scipy时,我能够将我的数据转换为以下格式:
(row, col)  (weight)
(0, 0)      5
(0, 47)     5
(0, 144)    5
(0, 253)    4
(0, 513)    5
...
(6039, 3107)    5
(6039, 3115)    3
(6039, 3130)    4
(6039, 3132)    2

我该如何将此转换为带有零值的数组或稀疏矩阵?(根据上面的数据,第1列到第46列应填充为零,依此类推...)
0 1 2 3  ... 47 48 49 50
1 [0 0 0 0 ... 5 0 0 0 0
2  2 0 1 0 ... 4 0 5 0 0
3  3 1 0 5 ... 1 0 0 4 2
4  0 0 0 4 ... 5 0 1 3 0
5  5 1 5 4 ... 0 0 3 0 1]

我知道按照上述格式保存数据在内存方面更好,但是我需要将其作为矩阵进行实验。


1
你尝试过什么?这个很简单。另外,根据你的数据集有多大,一次性将所有数据加载到内存中可能不可行。展示一些代码。 - Christopher Schneider
1个回答

7

scipy.sparse可以为您完成这项任务。

import numpy as np
from scipy.sparse import dok_matrix

your_data = [((2, 7), 1)]

XDIM, YDIM = 10, 10 # Replace with your values

dct = {}
for (row, col), weight in your_data:
    dct[(row, col)] = weight

smat = dok_matrix((XDIM, YDIM))
smat.update(dct)

dense = smat.toarray()

print dense

'''
[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  1.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]
'''

1
我正在使用Python3.6和scipy 1.0.0,但是这段代码会产生“NotImplementedError:不允许直接修改dok_matrix元素。” - 你有什么解决办法吗? - Béatrice Moissinac
似乎scipy有所变化。使用pandas,您可以执行pd.Series(dct).unstack().values,其中dct是一个以元组为键,权重为值的字典。 - hilberts_drinking_problem
@BéatriceMoissinac 或者 smat._update(dct),请参见此处 - phipsgabler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接