2014-06-10 6 views
-1

Je dispose d'un fichier csv avec en-têtes comme:Évite les valeurs exponentielles dans loadtxt

Étant donné ce fichier test.csv:

"A","B","C","D","E","F","timestamp" 
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948 
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366 
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486 

Si, j'utilise load.txt je reçois le tableau avec 3 lignes et 7 colonnes avec exponential valeurs.

r1 = numpy.loadtxt(open("test.csv","rb"),delimiter=",",skiprows=1) 

Je reçois

[[ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02 
    1.71537476e+03 7.65227770e+02 1.29111196e+12] 
    [ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02 
    1.71537476e+03 7.65227770e+02 1.29111311e+12] 
    [ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02 
    1.71537476e+03 7.65227770e+02 1.29112065e+12]] 

Pour éviter exponential je le code suivant, mais encore il donne les mêmes valeurs exponentielles. Mon code pour éviter exponentielle:

r1 = np.loadtxt(open("test.csv","rb"),delimiter=",", dtype=np.float64, skiprows=1) 

Est-il possible d'enlever la exponential tout en créant la matrice de numpy? Je sais que je peux supprimer les valeurs plus tard avec numpy.savetxt(sys.stdout, r1, '%5.2f') mais je le veux tout en créant la matrice pas après la création.

+0

611,88243 * est * 6.11882430e + 02, compte tenu des problèmes associés à l'arithmétique en virgule flottante). Tu ne veux pas lire dans les valeurs? Sinon, quel genre de résultat * recherchez-vous? Aussi, que voulez-vous faire avec la dernière colonne d'entrée, qui est déjà dans la notation exponentielle (1.291111964948E12)? –

+1

Pourquoi est-ce important? Y a-t-il une différence autre que dans la façon dont ils sont affichés? –

+0

@JoshuaTaylor Voir mon edit, il n'y aura pas de valeur exponentielle dans le fichier csv. – user2481422

Répondre

2

J'espère que les commentaires sur la question montrent clairement qu'il s'agit d'une simple question de formatage. Également souligné dans les commentaires, une bonne explication de quelques-unes des options de formatage pour les tableaux de numpy est donnée par @unutbu ici: How to pretty-printing a numpy.array without scientific notation and with given precision?

Une option non représentée dans cette réponse est l'utilisation de l'argument formatter à np.set_printoptions. L'argument a été ajouté à set_printoptions dans la version numpy 1.7.0. Avec l'argument formatter, vous pouvez contrôler la manière dont les éléments des tableaux sont affichés de manière numérique. Voici un exemple d'utilisation de cet argument pour contrôler le format des nombres à virgule flottante.

Voilà comment a est imprimé avec les paramètres par défaut:

In [30]: a 
Out[30]: 
array([[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03, 
      8.64075140e+02, 1.71537476e+03, 7.65227770e+02, 
      1.29111196e+12], 
     [ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03, 
      8.64075140e+02, 1.71537476e+03, 7.65227770e+02, 
      1.29111311e+12], 
     [ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03, 
      8.64075140e+02, 1.71537476e+03, 7.65227770e+02, 
      1.29112065e+12]]) 

la valeur par défaut principe de primauté et dire numpy pour convertir les valeurs en virgule flottante en chaînes en utilisant le format "%.5f". Ce format n'utilisera pas la notation scientifique, et il affichera toujours cinq chiffres après la virgule.

In [31]: np.set_printoptions(formatter={'float': lambda x: "%.5f" % (x,)}) 

In [32]: a 
Out[32]: 
array([[611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476, 
     765.22777, 1291111964948.00000], 
     [611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476, 
     765.22777, 1291113113366.00000], 
     [611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476, 
     765.22777, 1291120650486.00000]]) 

Vous pouvez ajouter un appel à rstrip pour supprimer les zéros:

In [53]: np.set_printoptions(formatter={'float': lambda x: ("%.5f" % (x,)).rstrip('0')}) 

In [54]: a 
Out[54]: 
array([[611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 
     1291111964948.], 
     [611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 
     1291113113366.], 
     [611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 
     1291120650486.]]) 

Notez que dans ce qui précède, je suis entré dans le nom ipython, et en écho sa valeur. Lorsqu'il est utilisé de cette manière, la représentation repr de l'objet est imprimée. Vous aurez la str -représentation si vous imprimez explicitement:

In [55]: print a 
[[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291111964948.] 
[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291113113366.] 
[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291120650486.]] 
+0

Votre réponse à cette erreur 'TypeError: set_printoptions() a reçu un argument mot-clé inattendu 'formatter'. – user2481422

+0

@ user2481422: L'argument 'formatter' a été ajouté en numpy 1.7.0 (https://github.com/numpy/numpy/blob/master/doc/release/1.7.0-notes.rst#custom-formatter-for -imprimés-tableaux). Quelle version utilisez-vous? –

+0

J'utilise 1.6.2 – user2481422

Questions connexes