Se si guarda il codice sorgente di np.savetxt
, vedrete che, mentre c'è un bel po 'di codice per gestire gli argomenti e le differenze tra Python 2 e Python 3, è in definitiva un semplice pitone loop sulle righe, in cui ogni riga è formattata e scritta nel file. Quindi non perderai nessuna esibizione se scrivi la tua. Ad esempio, ecco una funzione abita in fondo che scrive zeri compatti:
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')
Ad esempio:
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
allora, fino a quando si sta scrivendo la propria funzione savetxt
, si potrebbe anche fare maneggia matrici sparse, quindi non devi convertirlo in un array numerico (denso) prima di salvarlo. (Suppongo che l'array sparse sia implementato utilizzando una delle rappresentazioni sparse da scipy.sparse
.) Nella seguente funzione, l'unica modifica è da ... for value in row
a ... for value in row.A[0]
.
def savetxt_sparse_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.A[0])
fh.write(line + '\n')
Esempio:
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
L'utilizzo di un formato di archiviazione diverso e non denso potrebbe produrre risultati migliori. Vedi http://stackoverflow.com/questions/8955448/save-load-scipy-sparse-csr-matrix-in-portable-data-format per come farlo. – user2357112
Inoltre, considera di comprimerlo. 'savetxt' e' loadtxt' usano automaticamente gzip se il nome del file termina in '.gz'; questo potrebbe essere un modo semplice per ridurre il tuo file. – user2357112