如果您查看np.savetxt
的源代碼,您會發現雖然有相當多的代碼來處理Python 2和Python 3之間的參數和差異,但它最終只是一個簡單的python循環遍歷行,其中每行都被格式化並寫入文件。所以如果你自己寫的話,你不會失去任何表現。例如,這裏有一個相比下來函數寫入緊湊零:
def savetxt_compact(fname, x, fmt="%.6g", delimiter=','):
with open(fname, 'w') as fh:
for row in x:
line = delimiter.join("0" if value == 0 else fmt % value for value in row)
fh.write(line + '\n')
例如:
In [70]: x
Out[70]:
array([[ 0. , 0. , 0. , 0. , 1.2345 ],
[ 0. , 9.87654321, 0. , 0. , 0. ],
[ 0. , 3.14159265, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ]])
In [71]: savetxt_compact('foo.csv', x, fmt='%.4f')
In [72]: !cat foo.csv
0,0,0,0,1.2345
0,9.8765,0,0,0
0,3.1416,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
然後,只要你寫你自己的savetxt
功能,你還不如讓它處理稀疏矩陣,因此在保存之前不必將其轉換爲(密集)numpy數組。 (我假設稀疏數組是使用來自scipy.sparse
的稀疏表示之一實現的。)在以下函數中,唯一的更改是從... for value in row
到... for value in row.A[0]
。
例子:
In [112]: a
Out[112]:
<6x5 sparse matrix of type '<type 'numpy.float64'>'
with 3 stored elements in Compressed Sparse Row format>
In [113]: a.A
Out[113]:
array([[ 0. , 0. , 0. , 0. , 1.2345 ],
[ 0. , 9.87654321, 0. , 0. , 0. ],
[ 0. , 3.14159265, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ]])
In [114]: savetxt_sparse_compact('foo.csv', a, fmt='%.4f')
In [115]: !cat foo.csv
0,0,0,0,1.2345
0,9.8765,0,0,0
0,3.1416,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,0,0
使用不同的非密集存儲格式可能會產生更好的結果。有關如何執行此操作,請參閱http://stackoverflow.com/questions/8955448/save-load-scipy-sparse-csr-matrix-in-portable-data-format。 – user2357112
另外,考慮壓縮它。如果文件名以'.gz'結尾,'savetxt'和'loadtxt'自動使用gzip;這可能是縮小文件的一種簡單方法。 – user2357112