スパース行列の形式は、ゼロ以外の値を格納するだけなので、これらの値を書き込むのが最もコンパクトなオプションになります。しかし、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