【问题标题】:How to manually create a sparse matrix in Python如何在 Python 中手动创建稀疏矩阵
【发布时间】:2015-01-12 12:09:24
【问题描述】:

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

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

所以问题是,

  • 什么是合适的稀疏矩阵类型?
  • 我的代码是否朝着正确的方向前进?

非常感谢任何帮助。

【问题讨论】:

  • 我不懂格式,对于矩阵中的每个元素,你需要row,col, and value. Where is the value`信息吗?要增量创建稀疏矩阵,可以使用:docs.scipy.org/doc/scipy-0.14.0/reference/generated/…
  • 如果它需要有一个值,那么它可以是 1 或 True。这说明清楚了吗?
  • @HYRY 了解 dok_matrix 的提示,但我在初始化 dok_matrix 时是否还需要知道总列数?我的部分问题是我不能可靠地知道最大 COL 值是多少。我可以编写一个脚本来找出给定数据文件的最大值,但认为可能存在一些不需要我指定的现有 scipy 稀疏矩阵数据类型。

标签: python numpy matrix


【解决方案1】:

你可以使用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]))

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 2017-01-28
    • 2018-09-20
    • 2012-01-10
    • 2017-03-31
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2016-07-29
    相关资源
    最近更新 更多