[英]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
其中值v ij僅是非零值。
是否有任何直接功能可以做到這一點? 我懷疑,逐個元素地進行操作會非常昂貴!
稀疏矩陣格式僅存儲非零值,因此寫入這些值將是最緊湊的選擇。 但是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
遍歷數組行並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=',')
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.