web-dev-qa-db-fra.com

numpy.savetxt résultant d'une erreur d'incompatibilité de formatage dans python 3.5

J'essaie de sauvegarder une matrice numpy (Nx3, float64) dans un fichier txt à l'aide de numpy.savetxt:

np.savetxt(f, mat, fmt='%.5f', delimiter=' ')

Cette ligne a fonctionné dans python 2.7, mais dans python 3.5, je reçois l'erreur suivante:

TypeError: décalage entre le type de tableau et le spécificateur de format ('% .5f% .5f% .5f')

Lorsque j'entre dans le code de savetxt, l'impression de l'erreur (traceback.format_exc ()) dans le bloc catch (numpy.lib.npyio, ligne 1158), l'erreur est complètement différente:

TypeError: L'argument write () doit être str, pas d'octets

La ligne de code résultant de l'exception est la suivante:

fh.write(asbytes(format % Tuple(row) + newline))

J'ai essayé de supprimer les asbytes, et il semble corriger cette erreur. Est-ce un bug dans numpy?

25
Noam Peled

savetxt ouvre le fichier en mode wb et écrit ainsi tout sous forme d'octets.

Si à la place j'ouvre le fichier avec 'w', j'obtiens votre deuxième erreur:

In [403]: x=np.ones((3,3),dtype=np.float64)
In [404]: with open('test.txt','w') as f:
    np.savetxt(f,x,fmt='%.5f')
   .....:     
TypeError: must be str, not bytes

Mais il n'y a pas de problème avec

In [405]: with open('test.txt','wb') as f:
    np.savetxt(f,x,fmt='%.5f')
   .....:     
In [406]: cat test.txt
1.00000 1.00000 1.00000
1.00000 1.00000 1.00000
1.00000 1.00000 1.00000

Ceci est sur Py3.4; Je n'ai pas installé numpy avec mon 3.5 Python. Mais je ne m'attendrais pas à une différence.

Est-ce que

'%.5f'%1.2342

travailler sur votre système? Tu pourrais aussi essayer

'%.5f %.5f %.5f'%Tuple(mat[0,:])
23
hpaulj