TypeError: no coincidencia entre el tipo de matriz (‘objeto’) y el especificador de formato (‘% .18e’)

Tengo la siguiente matriz:

X = np.array([image_array_to_vector1,image_array_to_vector2,image_array_to_vector3,image_array_to_vector4]) 

Una impresión de X ve de la siguiente manera:

 [array([167, 167, 169, ..., 1, 1, 1], dtype=uint8) array([42, 43, 43, ..., 41, 36, 34], dtype=uint8) array([0, 0, 0, ..., 0, 0, 0], dtype=uint8) array([0, 0, 0, ..., 0, 0, 0], dtype=uint8)] 

Cuando bash guardar los datos como txt:

 X_to_text_file = np.savetxt('x.txt',X) 

Me sale lo siguiente:

 File "/Library/Python/2.7/site-packages/numpy/lib/npyio.py", line 1258, in savetxt % (str(X.dtype), format)) TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e') 

¿Porqué es eso? ¿Cómo puedo resolver el problema?

Gracias.

Es un poco difícil duplicar esto sin algunos datos de ejemplo, pero esto es lo que se me ocurrió.

 arr = np.array([np.array([1,2,3]), np.array([1,2,3,4])]) arr array([array([1, 2, 3]), array([1, 2, 3, 4])], dtype=object) np.savetxt('x.txt', arr) TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e') 

Como lo señaló @Artier, hay un pequeño fragmento al final de la respuesta aceptada en Escribir matriz de objeto en el archivo .txt que indica que puede guardar la matriz como una cadena con fmt='%s' . El uso de este formato parece resolver el problema por mí (de nuevo, no puedo recrear su problema exactamente sin una muestra de datos).

 np.savetxt('x.txt', arr, fmt='%s') 

Me gustaría señalar que si está buscando salvar arreglos dispares y quiere una ubicación única para guardarlos, es muy útil.

En esencia, savetxt está haciendo:

 for row in your_array: print(fmt % tuple(row)) 

donde se construye fmt su parámetro fmt (o el predeterminado) y el número de columnas, y el delimitador.

Tienes una matriz 1d de objetos (matrices). Así que la escritura / impresión será

  print(fmt % tuple(element)) 

%s es el único formato que puede manejar una matriz (u otro objeto general).

savetxt está destinado a ser utilizado con matrices numéricas 2d, el tipo de cosa que producirá las columnas csv necesarias. Tratar de usarlo en otras cosas como esta matriz de objetos te dará dolores de cabeza.

 In [2]: A = np.empty((3,),dtype=object) In [3]: A[:] = [np.arange(3),np.arange(1,4), np.arange(-3,0)] In [4]: A Out[4]: array([array([0, 1, 2]), array([1, 2, 3]), array([-3, -2, -1])], dtype=object) In [6]: np.savetxt('test',A,fmt='%s') In [7]: cat test [0 1 2] [1 2 3] [-3 -2 -1] 

Iterando en una matriz 1d debe saltarse la tuple . En cualquier caso, lo mejor que puedes hacer es un formato %s . De lo contrario, escriba su propio escritor de archivos personalizados. savetxt no es nada especial ni poderoso.

 In [9]: for row in A: ...: print('%s'%row) [0 1 2] [1 2 3] [-3 -2 -1] 

Tenía el mismo mensaje de error y parecía que el problema era que las matrices tenían una longitud diferente. Por lo tanto, debe asegurarse de proporcionar los arreglos np.savetxt de igual longitud.