将 Sparse.LIL 矩阵保存到 Python 中的 csv

Save a Sparse.LIL matrix to csv in Python

我有一个 0.15M x 1.3M sparse.lil 矩阵,我想将其存储在 csv 文件中。如何将其保存在 csv 文件中,以使生成的文件大小最小。根据我的说法,最好的方法是将其存储为

# output.csv

row1 col1 v11
row1 col2 v12
row1 col7 v17
row1 col9 v19
row2 col3 v23
row2 col6 v26

其中值 vij 仅是非零值。

是否有任何直接函数可以做到这一点?我怀疑,逐个元素地做它会非常昂贵!

稀疏矩阵格式仅存储非零值,因此写入这些值将是最紧凑的选择。但是 lil 是列表格式的列表,这不是你要写的格式。

但是coo格式将其数据存储在3个属性中,行,列和数据,这是您想要的值。

scipy.io 具有处理稀疏的 savemat 格式,但它是一个 MATLAB 样式文件。我不熟悉 scipy.io.

中的其他选项

这些值是整数吗?那将是最简单的。这里我把coo格式的3个属性数组拼接成一个Nx3的数组,然后用通常的np.savetxt.

保存到文本文件中
In [649]: M = sparse.eye(10).tolil()

In [650]: Mc = M.tocoo()

In [651]: Mc.row,Mc.col,Mc.data
Out[651]: 
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32),
 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32),
 array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.]))

In [652]: A=np.column_stack((Mc.row,Mc.col,Mc.data))

In [653]: A.shape
Out[653]: (10, 3)

In [655]: np.savetxt('lil.txt',A, fmt='%5.d',delimiter=',')

In [656]: cat lil.txt
    0,    0,    1
    1,    1,    1
    2,    2,    1
    ...
    7,    7,    1
    8,    8,    1
    9,    9,    1

排阵会很快。写入它需要时间,因为 np.savetxt 遍历数组行,并逐行写入。但是面对现实,所有文本文件都是逐行写入的,对吧?

 f.write(fmt % tuple(row))

这是 lil 数组的格式:

In [658]: M.rows
Out[658]: array([[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], dtype=object)

In [659]: M.data
Out[659]: array([[1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0], [1.0]], dtype=object)

实际上 M 数据值是浮动的。 A 数组也是浮点数。所以我可以用浮动格式保存,例如。 np.savetxt('lil.txt',A, fmt='%10.5f',delimiter=',')

np.savetxt('lil.txt',A, fmt='%10d,%10d,%10.5f') 写入 2 个整数列和一个浮点数。

如果您不喜欢所写的某些整数索引值,我们可能需要将 A 形成为结构化数组。

====================

另一种选择是直接写台词。根据我对 np.savetxt 的了解,这可能同样快。

In [678]: with open('lil.txt','wb') as f:
    for x in zip(Mc.row,Mc.col,Mc.data):
        f.write(b'%5d,%5d,%10f\n'%x)
   .....:         

In [679]: cat lil.txt
    0,    0,  1.000000
    1,    1,  1.000000
    2,    2,  1.000000
    ...
    8,    8,  1.000000
    9,    9,  1.000000