Al guardar una matriz numpy en csv se produce un error de coincidencia de TypeError

Tengo una matriz numpy con datos numéricos de la forma:

example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)]) 

Así que es una matriz de 10 grupos, donde cada grupo consta de 2 listas de igual longitud y solo contiene números. Ejecutar el siguiente código de guardado me da el siguiente error:

 numpy.savetxt('exampleData.csv', test, delimiter=',') TypeError: Mismatch between array dtype ('int32') and format specifier ('%.18e %.18e') 

Supongo que esto podría solucionarse con algo en el argumento fmt = ‘xyz’, pero la documentación no es particularmente clara. Cualquier ayuda sería apreciada.

(En mis datos reales, las listas i y j son listas de flotadores largos, por ejemplo, ‘0.0047322940571 ‘, etc.)

Tu example es una matriz 3d

 In [82]: example=np.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 3)]) # chg 10 to 3 for display In [83]: example.shape Out[83]: (3L, 2L, 5L) In [84]: example Out[84]: array([[[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]], [[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]], [[0, 1, 2, 3, 4], [0, 0, 0, 0, 0]]]) 

intentar guardar todo esto da como resultado un error (mensaje diferente debido a una versión diferente):

 In [87]: np.savetxt('test.csv',example, delimiter=',') .... TypeError: float argument required, not numpy.ndarray 

pero guardar una ‘fila’ está bien

 In [88]: np.savetxt('test.csv',example[1,...], delimiter=',') 

Guardar con formato entero hace una salida más bonita

 In [94]: np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%d') In [95]: with open('test.csv') as f:print f.read() 0,1,2,3,4 0,0,0,0,0 

Entonces, ¿cómo quieres que se guarde la matriz 3d? Tenga en cuenta cómo lo va a usar / leerlo. Múltiples archivos? ¿Múltiples bloques dentro de un archivo?

https://stackoverflow.com/a/3685339/901925 es una respuesta SO de 6 años sobre cómo guardar una matriz 3d. La respuesta simple es abrir un archivo y realizar múltiples savetxt de savetxt para los segmentos de la matriz. Esto guarda los datos en bloques. Pero cargar esos bloques es otra pregunta de SO (que ha surgido antes).

 In [100]: with open('test.csv','w') as f: ...: for row in example: ...: np.savetxt(f,row,delimiter=',',fmt='%d',footer='====') ...: In [101]: with open('test.csv') as f:print f.read() 0,1,2,3,4 0,0,0,0,0 # ==== 0,1,2,3,4 0,0,0,0,0 # ==== 0,1,2,3,4 0,0,0,0,0 # ==== 

En respuesta a tu comentario, esto funciona.

 example=np.ones((4,2,100)) np.savetxt('test.csv',example[1,...], delimiter=',',fmt='%.18e') 

Otra forma de guardar una matriz 3d es remodelarla a 2d. Lo vuelve a formar en 3d después de cargarlo, posiblemente utilizando la información que almacenó en una línea de comentarios.

 np.savetxt('test.csv',example.reshape(-1,example.shape[-1]), delimiter=',',fmt='%.18e') 
 import numpy example = numpy.array([[[i for i in range(0, 5)],[0 for j in range(0, 5)]] for k in range(0, 10)]) f = open('exampleData.csv', 'ab') for i in example: numpy.savetxt(f, i, fmt='%i')