我有一个文本文件,其中包含表示具有以下格式的稀疏矩阵的数据:
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
所以问题是,
非常感谢任何帮助。
答案 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]))