2016-05-20 6 views
2

私はcsvファイルに保存する0.15M x 1.3Mのsparse.lil行列を持っています。どのようにしてCSVファイルに保存して、結果のファイルサイズが最小になるようにすることができます。 IJ V PythonでSparse.LIL行列をcsvに保存する

# output.csv 

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

は唯一の非ゼロ値も同様である。私によると最良の方法は、それを格納することになります

これを行う直接的な機能はありますか?私はそれを要素ごとに行うことは非常に高価になると思われます!

答えて

3

スパース行列の形式は、ゼロ以外の値を格納するだけなので、これらの値を書き込むのが最もコンパクトなオプションになります。しかし、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配列もfloatです。だから私はフロート形式で保存することができました。 np.savetxt('lil.txt',A, fmt='%10.5f',delimiter=',')

2つの整数列とfloatを書き込みます。

整数インデックス値の一部が書かれていると気に入らない場合は、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 
関連する問題