如何在Python中手动创建稀疏矩阵

时间:2014-11-15 00:44:34

标签: python numpy matrix

我有一个文本文件,其中包含表示具有以下格式的稀疏矩阵的数据:

0 234 345
0 236 
0 345 365 465
0 12 35 379

数据用于分类任务,每行可以被视为特征向量。每行中的第一个值表示一个标签,其后面的值表示各个功能的存在。

我尝试使用这些值创建稀疏矩阵(用于scikit learn的机器学习任务)。我找到并阅读了scipy.sparse documentation,但我没有理解如何逐步建立一个包含这样的源数据的稀疏矩阵。

我到目前为止发现的例子展示了如何采用密集矩阵并对其进行转换,或者如何创建具有人为数据的原生稀疏矩阵,但没有任何例子可以帮助我。我确实找到了这个相关的SO问题(Building and updating a sparse matrix in python using scipy),但是这个例子假设你知道最大的COL,ROW大小,我不知道,所以数据类型似乎不合适。

到目前为止,我有以下代码来阅读文档并将值解析为看似合理的内容:

def get_sparse_matrix():
    matrix = []
    with open("data.dat", 'r') as f:
        for i, line in enumerate(f):
            row = line.strip().split()
            label = row[0]
            features = entry[1:]
            matrix.append([(i, col) for col in features])

    sparse_matrix = #magic happens here

    return sparse_matrix

所以问题是,

  • 这里使用的稀疏矩阵类型是什么?
  • 我是否按照我的代码朝着正确的方向前进?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您可以使用coo_matrix()

import numpy as np
from scipy import sparse
data = """0 234 345
0 236 
0 345 365 465
0 12 35 379"""

column_list = []
for line in data.split("\n"):
    values = [int(x) for x in line.strip().split()[1:]]
    column_list.append(values)
lengths = [len(row) for row in column_list]
cols = np.concatenate(column_list)
rows = np.repeat(np.arange(len(column_list)), lengths)
m = sparse.coo_matrix((np.ones_like(rows), (rows, cols)))

以下是检查结果的代码:

np.where(m.toarray())

输出:

(array([0, 0, 1, 2, 2, 2, 3, 3, 3]),
 array([234, 345, 236, 345, 365, 465,  12,  35, 379]))