簡體   English   中英

將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

其中值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM