python中的稀疏表示数据文件

时间:2015-04-27 12:28:06

标签: python python-2.7

我是python的新手,我有一个以下格式的文件:

2:10 13:1 17:6 21:10
3:11 131:12
...

每一行都包含column:value形式的元素。在示例中,这意味着第一行应该在第二列中包含10,在第13列中包含1,依此类推。编辑:数据中的每一行对应矩阵中的一行

这是python知道如何转换为稀疏矩阵的格式吗? (例如,为了执行PCA)或者我必须自己构建矩阵吗?

2 个答案:

答案 0 :(得分:1)

我正在做以下假设

  1. 该文件包含与您正在阅读的矩阵一样多的行
  2. 一个文件的行可能为空
  3. 矩阵是正方形
  4. 数据文件中的列索引从1开始
  5. 我正在使用模块scipy.sparse

    from scipy import sparse
    
    I, J, V = [], [], []
    
    for i, line in enumerate(open(datafile)):
        for j, v in [map(int,item.split(':')) for item in line.split()]:
            I.append(i) ; J.append(j-1) ; V.append(v)
    A = sparse.coo_matrix((V,(I,J)), shape=(i+1,i+1)
    print A.todense()
    

    包含以下数据

    1:2 3:4
    
    
    2:5
    

    上面的代码打印

    [[2 0 4 0]
     [0 0 0 0]
     [0 0 0 0]
     [0 5 0 0]]
    

答案 1 :(得分:0)

要使此任务内存高效且高效,请查看Collections库,特别是defaultdict。您只会存储具有相应列(键)的数据值。数据将不再是'矩阵,但这意味着您不必存储不存在的值。

(请注意我在您的数据中添加了' 2:11'因此一列会有多个值)

from collections import defaultdict    
d = defaultdict(list)    

data = '2:10 13:1 17:6 21:10 3:11 131:12 2:11'.split()

for x in data:
    k = x.split(':')[0]
    v = x.split(':')[1]

    d[k].append(v)

print d

给出输出:

defaultdict(<type 'list'>, {'13': ['1'], '21': ['10'], '17': ['6'], '3': ['11'], '131': ['12'], '2': ['10','11]})

在这种情况下,您只存储具有值的列(字典键)。