Numpy conversion tableau de float à cordes
J'ai un tableau de chars que j'ai normalisée à un (c'est à dire le plus grand nombre dans le tableau 1), et je voulais l'utiliser comme couleur indices pour un graphique. En utilisant matplotlib à l'utilisation de niveaux de gris, cela nécessite l'utilisation de chaînes de caractères entre 0 et 1, donc j'ai voulu convertir le tableau de flotteurs vers un tableau de chaînes de caractères. J'ai été de tenter de le faire en utilisant "astype('str')", mais cela semble créer quelques valeurs qui ne sont pas les mêmes (ou à proximité) pour les originaux.
Je remarque cela parce que matplotlib se plaint de trouver le numéro 8 dans la matrice, ce qui est étrange qu'il a été normalisée à un!
En bref, j'ai un tableau phis, de float64, tels que:
numpy.where(phis.astype('str').astype('float64') != phis)
est non vide. C'est étonnant comme (je l'espère naïvement) qu'il semble être un bug dans numpy, est-il quelque chose que je pourrait avoir fait du mal à la cause?
Edit: après enquête, cela semble être dû à la façon dont la fonction de chaîne poignées de haute précision des flotteurs. À l'aide d'un vectorisé fonction toString (à partir de robbles de réponse), c'est aussi le cas, cependant, si la fonction lambda est:
lambda x: "%.2f" % x
Alors le graphique fonctionne - curiouser et de curiouser. (Évidemment, les tableaux ne sont plus égales d'ailleurs!)
Vous devez vous connecter pour publier un commentaire.
Vous semblent un peu confus quant à la façon des tableaux numpy travail en coulisses. Chaque élément dans un tableau doit être le même taille.
La représentation sous forme de chaîne d'un flotteur ne fonctionne pas de cette façon. Par exemple,
repr(1.3)
rendements'1.3'
, maisrepr(1.33)
rendements'1.3300000000000001'
.Une exacte représentation de chaîne d'un nombre à virgule flottante produit un de longueur variable chaîne.
Parce que numpy tableaux se composent des éléments qui sont toutes de la même taille, numpy vous oblige à spécifier la longueur des chaînes de caractères dans le tableau lorsque vous êtes à l'aide de tableaux de chaîne.
Si vous utilisez
x.astype('str')
, il sera toujours convertir des choses à un tableau de chaînes de longueur 1.Par exemple, à l'aide de
x = np.array(1.344566)
,x.astype('str')
rendements'1'
!Vous devez être plus explicit et l'utilisation de la
'|Sx'
dtype de la syntaxe, oùx
est la longueur de la chaîne pour chaque élément du tableau.Par exemple, l'utilisation
x.astype('|S10')
pour convertir le tableau de chaînes de caractères de longueur 10.Encore mieux, juste éviter d'utiliser numpy des tableaux de chaînes de caractères au total. C'est généralement une mauvaise idée, et il n'y a pas de raison que je vois à partir de votre description de votre problème à les utiliser en premier lieu...
float
, cependant, certains sontnan
. 3.) si tous sont lus comme des float, il y auradouble64
variables dans la liste qui apparaissent comme desnan
mais ne sont pas reconnus commenumpy.nan
4.) afin de remplacer ceux, j'ai utilisé avec succès:if V[-1].astype('|S3') == 'nan': V[-1] = numpy.nan
Si vous avez un tableau de
numbers
et que vous voulez un tableau destrings
, vous pouvez écrire:Si vos numéros sont les flotteurs, le tableau serait un tableau avec les mêmes numéros que les cordes avec deux décimales.
Avis qu'il fonctionne également avec
numpy
tableaux:Une méthode similaire peut être utilisé si vous avez un tableau multidimensionnel:
Exemple:
Si vous cochez la Matplotlib exemple pour la fonction que vous utilisez, vous remarquerez qu'ils utilisent une méthode similaire: construire la matrice vide et le remplir avec des cordes construit avec la méthode d'interpolation. La partie pertinente de l'référencé code est:
list
, il veut un tableau numpy.C'est probablement plus lent que ce que vous voulez, mais vous pouvez le faire:
On dirait qu'il arrondit les valeurs lorsqu'il convertit à la str de float64, mais de cette façon, vous pouvez personnaliser la conversion comme vous voulez.
Si le problème principal est la perte de précision lors de la conversion d'un flotteur pour une chaîne de caractères, il est possible de de chemin à parcourir est de convertir la flotte à la
decimal
S: http://docs.python.org/library/decimal.html.En python 2.7 et plus vous pouvez directement convertir un float pour un
decimal
objet.