web-dev-qa-db-fra.com

TypeError: non concordance entre le type de tableau et le spécificateur de format ('% .18e')

J'ai le tableau suivant:

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

Une copie de X se présente comme suit:

[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)]

Lorsque j'essaie de sauvegarder les données au format txt:

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

Je reçois ce qui suit:

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')

Pourquoi donc? Comment puis-je résoudre le problème?

Merci.

4
Simplicity

Il est un peu difficile de reproduire cela sans quelques exemples de données, mais voici ce que j'ai proposé.

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')

Comme l'a souligné @Artier, il y a un petit extrait de code à la fin de la réponse acceptée dans Write object array to .txt file qui indique que vous pouvez simplement sauvegarder le tableau en tant que chaîne avec fmt='%s'. L'utilisation de ce format semble résoudre le problème pour moi (encore une fois, je ne peux pas recréer votre problème exactement sans un échantillon de données).

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

Je vous ferai remarquer que si vous souhaitez sauvegarder des tableaux disparates et que vous souhaitez un emplacement unique pour les conserver, savez est très utile.

8
Grr

savetxt fait essentiellement ce qui suit:

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

fmt est construit votre paramètre fmt (ou celui par défaut) et le nombre de colonnes et le délimiteur.

Vous avez un tableau 1d d'objets (tableaux). Donc, l’écriture/impression sera

 print(fmt % Tuple(element))

%s est le seul format capable de gérer un tableau (ou un autre objet général).

savetxt est destiné à être utilisé avec des tableaux numériques 2d, le genre de choses qui produiront des colonnes csv. Essayer de l'utiliser sur d'autres choses comme ce tableau d'objets va vous donner mal à la tête.

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]

En itérant sur un tableau 1d, il doit ignorer la variable Tuple. Dans tous les cas, le mieux que vous puissiez faire est un format %s. Sinon, écrivez votre propre rédacteur de fichier personnalisé. savetxt n'est rien de spécial ni de puissant.

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

J'ai eu le même message d'erreur, et il est apparu que le problème venait de tableaux de longueurs différentes. Vous devez donc vous assurer de donner aux tableaux np.savetxt des longueurs égales.

0
Olga