Se vuoi scriverlo su disco in modo che sia facile da leggere di nuovo come un array numpy, guarda in numpy.save
. Anche il decapaggio funzionerà bene, ma è meno efficiente per array di grandi dimensioni (cosa che il tuo non è, quindi va perfettamente bene).
Se vuoi che sia leggibile dall'uomo, controlla numpy.savetxt
.
Modifica: Quindi, sembra che savetxt
non sia un'opzione così eccezionale per gli array con> 2 dimensioni ... Ma solo per portare tutto alla sua conclusione completa:
Mi sono appena reso conto che si numpy.savetxt
strozza su ndarrays con più di 2 dimensioni ... Questo è probabilmente dovuto alla progettazione, poiché non esiste un modo intrinsecamente definito per indicare dimensioni aggiuntive in un file di testo.
Ad esempio, questo (un array 2D) funziona bene
import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)
Mentre la stessa cosa fallirebbe (con un errore piuttosto poco informativo :) TypeError: float argument required, not numpy.ndarray
per un array 3D:
import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)
Una soluzione alternativa è semplicemente suddividere l'array 3D (o superiore) in sezioni 2D. Per esempio
x = np.arange(200).reshape((4,5,10))
with file('test.txt', 'w') as outfile:
for slice_2d in x:
np.savetxt(outfile, slice_2d)
Tuttavia, il nostro obiettivo è essere chiaramente leggibili dall'uomo, pur essendo facilmente leggibili con numpy.loadtxt
. Pertanto, possiamo essere un po 'più prolissi e differenziare le sezioni usando le righe commentate. Per impostazione predefinita, numpy.loadtxt
ignorerà tutte le righe che iniziano con #
(o il carattere specificato da comments
kwarg). (Sembra più prolisso di quanto non sia in realtà ...)
import numpy as np
# Generate some test data
data = np.arange(200).reshape((4,5,10))
# Write the array to disk
with open('test.txt', 'w') as outfile:
# I'm writing a header here just for the sake of readability
# Any line starting with "#" will be ignored by numpy.loadtxt
outfile.write('# Array shape: {0}\n'.format(data.shape))
# Iterating through a ndimensional array produces slices along
# the last axis. This is equivalent to data[i,:,:] in this case
for data_slice in data:
# The formatting string indicates that I'm writing out
# the values in left-justified columns 7 characters in width
# with 2 decimal places.
np.savetxt(outfile, data_slice, fmt='%-7.2f')
# Writing out a break to indicate different slices...
outfile.write('# New slice\n')
Questo produce:
# Array shape: (4, 5, 10)
0.00 1.00 2.00 3.00 4.00 5.00 6.00 7.00 8.00 9.00
10.00 11.00 12.00 13.00 14.00 15.00 16.00 17.00 18.00 19.00
20.00 21.00 22.00 23.00 24.00 25.00 26.00 27.00 28.00 29.00
30.00 31.00 32.00 33.00 34.00 35.00 36.00 37.00 38.00 39.00
40.00 41.00 42.00 43.00 44.00 45.00 46.00 47.00 48.00 49.00
# New slice
50.00 51.00 52.00 53.00 54.00 55.00 56.00 57.00 58.00 59.00
60.00 61.00 62.00 63.00 64.00 65.00 66.00 67.00 68.00 69.00
70.00 71.00 72.00 73.00 74.00 75.00 76.00 77.00 78.00 79.00
80.00 81.00 82.00 83.00 84.00 85.00 86.00 87.00 88.00 89.00
90.00 91.00 92.00 93.00 94.00 95.00 96.00 97.00 98.00 99.00
# New slice
100.00 101.00 102.00 103.00 104.00 105.00 106.00 107.00 108.00 109.00
110.00 111.00 112.00 113.00 114.00 115.00 116.00 117.00 118.00 119.00
120.00 121.00 122.00 123.00 124.00 125.00 126.00 127.00 128.00 129.00
130.00 131.00 132.00 133.00 134.00 135.00 136.00 137.00 138.00 139.00
140.00 141.00 142.00 143.00 144.00 145.00 146.00 147.00 148.00 149.00
# New slice
150.00 151.00 152.00 153.00 154.00 155.00 156.00 157.00 158.00 159.00
160.00 161.00 162.00 163.00 164.00 165.00 166.00 167.00 168.00 169.00
170.00 171.00 172.00 173.00 174.00 175.00 176.00 177.00 178.00 179.00
180.00 181.00 182.00 183.00 184.00 185.00 186.00 187.00 188.00 189.00
190.00 191.00 192.00 193.00 194.00 195.00 196.00 197.00 198.00 199.00
# New slice
Rileggerlo è molto semplice, purché conosciamo la forma dell'array originale. Possiamo solo fare numpy.loadtxt('test.txt').reshape((4,5,10))
. Ad esempio (puoi farlo in una riga, sono solo prolisso per chiarire le cose):
# Read the array from disk
new_data = np.loadtxt('test.txt')
# Note that this returned a 2D array!
print new_data.shape
# However, going back to 3D is easy if we know the
# original shape of the array
new_data = new_data.reshape((4,5,10))
# Just to check that they're the same...
assert np.all(new_data == data)
numpy.loadtxt
( docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html )