¿Cómo guardo una matriz 3D Python / NumPy como un archivo de texto?

Tengo que iniciar una gran cantidad de cálculos, y tengo que guardar un texto de archivo 2D cada vez, por lo que me gustaría almacenar los resultados en “tiempo real” como un archivo de texto 3D con cada segmento correspondiente a un resultado de cálculo.

El primer cálculo está bien, pero cuando hago el segundo cálculo, durante el paso “np.loadtxt”, las dimensiones de la matriz se convierten en 2D … Así que no puedo alcanzar mi objective … y no puedo hacer una reforma. cuando comienzo a las dimensiones (…, …, 1)

#MY FIRST RESULTS test1 = open("C:/test.txt", "r") test_r = np.genfromtxt(test, skip_header=1) test_r = np.expand_dims(test_r, axis=2) #I create a new axis to save in 3D test1.close() #I test if the "Store" file to keep all my results is created. try: Store= np.loadtxt('C:/Store.txt') except: test=1 #If "Store" is not created, I do it or I concatenate in my file. if test ==1: Store= test_r np.savetxt('C:/Store.txt', Store) test=2 else: Store = np.concatenate((Store,test_r), axis=2) np.savetxt('C:/Store.txt', Store) #MY SECOND RESULTS test2 = open("C:/test.txt", "r") test_r = np.genfromtxt(test, skip_header=1) test_r = np.expand_dims(test_r, axis=2) test2.close() #I launch the procedure again to "save" the results BUT DURING THE LOADTXT STEP THE ARRAY DIMENSIONS CHANGE TO BECOME A 2D ARRAY... try: Store= np.loadtxt('C:/Store.txt') except: test=1 if test ==1: Store= test_r np.savetxt('C:/Store.txt', Store) test=2 else: Store = np.concatenate((Store,test_r), axis=2) np.savetxt('C:/Store.txt', Store) 

Aquí hay un ejemplo de cPickle:

 import cPickle # write to cPickle cPickle.dump( thing_to_save, open( "filename.pkl", "wb" ) ) # read from cPickle thing_to_save = cPickle.load( open( "filename.pkl", "rb" ) ) 

Los "wb" y "rb" para la función open() son importantes. CPickle escribe objetos en un formato binario, por lo que usar solo "w" y "r" no funcionará.

Si el archivo guardado tiene que ser un texto de estilo ‘csv’, puede usar múltiples savetxt y loadtxt . Se sabe que la clave es que ambos pueden tomar un archivo abierto como entrada.

Ejemplo de escritura:

 In [31]: A=np.arange(3*2*4).reshape(3,2,4) In [32]: A # normal display as 3 blocks of 2d array Out[32]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]], [[16, 17, 18, 19], [20, 21, 22, 23]]]) In [36]: for a in A:print a, '\n' # or iterate on the 1st dimension [[0 1 2 3] [4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]] [[16 17 18 19] [20 21 22 23]] 

Siguiendo ese ejemplo, puedo iterar en el archivo, usando savetxt para cada subarray:

 In [37]: with open('3dcsv.txt','wb') as f: for a in A: np.savetxt(f, a, fmt='%10d') f.write('\n') ....: 

Confirme la escritura del archivo con un cat sistema (a través de ipython):

 In [38]: cat 3dcsv.txt 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 

Para una lectura simple, loadtxt aparentemente ignora las líneas vacías, devolviendo una matriz de 6 x 4. Así que sé que se supone que es (2,3,4) Puedo cambiar fácilmente el resultado.

 In [39]: np.loadtxt('3dcsv.txt') Out[39]: array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [ 12., 13., 14., 15.], [ 16., 17., 18., 19.], [ 20., 21., 22., 23.]]) 

Después de un poco de depuración conseguí que funcionara este loadtxt múltiple. loadtxt (y genfromtxt ) funciona con una lista de líneas.

 In [53]: A1=[] # list to collect blocks In [54]: with open('3dcsv.txt') as f: lines = [] # list to collect lines while 1: aline = f.readline() if aline.strip(): lines.append(aline) # nonempty line else: # empty line if len(lines)==0: break A1.append(np.loadtxt(lines, dtype=int)) lines = [] ....: In [55]: A1 = np.array(A1) In [56]: A1 Out[56]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]], [[16, 17, 18, 19], [20, 21, 22, 23]]]) 

Puede que este no sea el emparejamiento más robusto de guardar / cargar, pero proporciona un marco para construir algo mejor.

Pero si no necesita ser texto, pickle está bien, al igual que el número nativo “guardar / cargar”

 In [57]: np.save('3dsave.npy',A) In [58]: np.load('3dsave.npy') Out[58]: array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]], [[16, 17, 18, 19], [20, 21, 22, 23]]])