【问题标题】:transform an adjacency list into a sparse adjacency matrix using python使用python将邻接列表转换为稀疏邻接矩阵
【发布时间】:2016-07-19 04:25:09
【问题描述】:

使用 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]

我知道将数据保存为上述格式在内存方面会更好,但我需要它作为实验的矩阵。

【问题讨论】:

  • 你试过什么?这是非常微不足道的。此外,根据您的数据集有多大,一次将所有数据加载到内存中可能是不可行的。显示一些代码。

标签: python scipy sparse-matrix data-manipulation


【解决方案1】:

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

【讨论】:

  • 我正在使用 Python3.6 和 scipy 1.0.0,这个确切的代码会产生 NotImplementedError: Direct modification to dok_matrix element is not allowed. - 知道如何解决这个问题吗?
  • 似乎是 scipy 的变化。使用 pandas,您可以执行 pd.Series(dct).unstack().values 其中 dct 是一个字典,其中元组作为键,权重作为值。
  • @BéatriceMoissinac 或smat._update(dct),见here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
相关资源
最近更新 更多