代码之家  ›  专栏  ›  技术社区  ›  Daniel F

稀疏矩阵输出到csv

  •  0
  • Daniel F  · 技术社区  · 6 年前

    我有一个稀疏矩阵 z 那是一个 scipy.sparse.csr_matrix 有形状 (n,m) 哪里 n<<m . 我也有标签 l 这只是一个 np.array 有大小的字符串 n .

    我想做的是制作一个csv文件与“破烂”版本的数据。i、 所有的非零维 z[0] 将进入csv文件的一列,其中包含一个头值 l[0] ,但每列的值数目不同。不幸的是 numpy 不能很好地处理杂乱的数组,我不确定什么是构造它的优雅方法。

    现在我只是在做

    np.savetxt(pth, z.todense().T, delimiter = ",")
    

    在我的下一个处理步骤中手动添加列标题可以处理所有的零,但是这样做非常慢。

    例子:

    z.todense()
    array([[0,0,1,0,0,-1,0,3,0,-6,4],
           [-1,0,4,0,0,0,0,0,0,0,-2]])
    
    l
    array(["chan1", "chan2"])
    

    我想要什么

    example.csv
    
    chan1, chan2
    1,-1
    -1,4
    3,-2
    -6,
    4,
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   hpaulj    6 年前
    In [74]: from scipy import sparse
    
    In [75]: M = sparse.csr_matrix([[0,0,1,0,0,-1,0,3,0,-6,4],
        ...:        [-1,0,4,0,0,0,0,0,0,0,-2]])
    In [76]: M
    Out[76]: 
    <2x11 sparse matrix of type '<class 'numpy.int64'>'
        with 8 stored elements in Compressed Sparse Row format>
    
    In [77]: M.A
    Out[77]: 
    array([[ 0,  0,  1,  0,  0, -1,  0,  3,  0, -6,  4],
           [-1,  0,  4,  0,  0,  0,  0,  0,  0,  0, -2]], dtype=int64)
    

    lil 格式按行给出数据:

    In [78]: Ml = M.tolil()
    In [79]: Ml.data
    Out[79]: array([list([1, -1, 3, -6, 4]), list([-1, 4, -2])], dtype=object)
    

    现在只需要按照您想要的方式将这些列表写入文件:

    In [81]: from itertools import zip_longest
    
    In [82]: for i,j in zip_longest(*Ml.data, fillvalue=''):
        ...:     astr = '%s, %s'%(i,j)
        ...:     print(astr)
        ...:     
    1, -1
    -1, 4
    3, -2
    -6, 
    4, 
    

    zip_longest 使用最长的作为引用,是遍历多个列表的简单方法。