Si vous voulez l'écrire sur le disque de façon à ce qu'il soit facile de le relire sous forme de tableau numpy, jetez un œil à numpy.save
. Le décapage fonctionne bien aussi, mais il est moins efficace pour les grands tableaux (ce qui n'est pas le cas du vôtre, donc l'un ou l'autre convient parfaitement).
Si vous voulez qu'il soit lisible par l'homme, regardez dans numpy.savetxt
.
Editar: Donc, il semble que savetxt
n'est pas une aussi bonne option pour les tableaux à >2 dimensions... Mais juste pour aller jusqu'au bout de la démarche :
Je viens de réaliser que numpy.savetxt
s'étrangle sur les tableaux de ndarrays avec plus de 2 dimensions... C'est probablement à dessein, car il n'y a pas de moyen intrinsèquement défini d'indiquer des dimensions supplémentaires dans un fichier texte.
Par exemple, ceci (un tableau 2D) fonctionne bien.
import numpy as np
x = np.arange(20).reshape((4,5))
np.savetxt('test.txt', x)
Alors que la même chose échouerait (avec une erreur plutôt peu informative : TypeError: float argument required, not numpy.ndarray
) pour un réseau 3D :
import numpy as np
x = np.arange(200).reshape((4,5,10))
np.savetxt('test.txt', x)
Une solution consiste à décomposer le tableau 3D (ou plus) en tranches 2D. Par exemple
x = np.arange(200).reshape((4,5,10))
with open('test.txt', 'w') as outfile:
for slice_2d in x:
np.savetxt(outfile, slice_2d)
Cependant, notre objectif est d'être clairement lisible par l'homme, tout en étant facilement relisible avec les données de l'entreprise. numpy.loadtxt
. Par conséquent, nous pouvons être un peu plus verbeux, et différencier les tranches en utilisant des lignes commentées. Par défaut, numpy.loadtxt
ignorera toutes les lignes qui commencent par #
(ou tout autre caractère spécifié par l'option comments
kwarg). (Cela semble plus verbeux qu'il ne l'est en réalité...)
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')
Cela donne :
# 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
La relecture est très facile, pour autant que l'on connaisse la forme du tableau d'origine. Nous pouvons simplement faire numpy.loadtxt('test.txt').reshape((4,5,10))
. A titre d'exemple (Vous pouvez faire cela en une seule ligne, je suis juste verbeux pour clarifier les choses) :
# 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)