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

时间:2016-03-30 22:54:02

标签: python scipy sparse-matrix data-manipulation

使用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 个答案:

答案 0 :(得分:5)

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.]]
'''