Numpy: npyio.loadtxt est une entrée de fichier texte de conversion d'octets, même avec str dtype spécifié.

Créé le 8 nov. 2012  ·  11Commentaires  ·  Source: numpy/numpy

Environnement

  • Python: version 3.3 (version python.org) sur OS X Mountain Lion
  • numpy: cloné depuis git master

Lors de l'appel de numpy.loadtxt sur un fichier contenant des chaînes comme suit:

import numpy as np
datestxt = np.loadtxt("NYSE_dates.txt", dtype=str)
print(datetxt)

Où NYSE_dates.txt est simplement une liste de dates (peut être quelque chose de vraiment):

7/5/1962
7/6/1962
7/9/1962
...
12/29/2020
12/30/2020
12/31/2020

La sortie est:

["b'7/5/1962'" "b'7/6/1962'" "b'7/9/1962'" ..., "b'12/29/2020'"
 "b'12/30/2020'" "b'12/31/2020'"]

Comme vous pouvez le voir, toutes les chaînes ont été converties en octets, puis stringifiées via conv , comme vous obtiendriez le même résultat à partir de str(str('12/31/2020').encode('latin1')) , par conv & compat.asbytes .

Après avoir regardé le code, il semble que toutes les chaînes sont converties en octets avec asbytes(...) peu près partout, comme par exemple dans split_line(...) , donc cela doit signifier que chaque routine du module est cassée.

00 - Bug numpy.lib

Commentaire le plus utile

Assez choquant que cela n'ait pas été corrigé depuis 5 ans

Tous les 11 commentaires

J'ai aussi ce problème. C'est très très ennuyeux; fondamentalement, vous ne pouvez pas utiliser loadtxt en Python3.

Solution temporaire: j'ai supprimé tous les appels asbytes () dans la méthode loadtxt.

Ouais, je me souviens avoir pensé que quelque chose était louche là-dedans quand j'ai parcouru le code.

Pour mémoire, je rencontre le même problème avec les entrées datetime64, conduisant à une erreur d'analyse de la forme: Error parsing datetime string "b'2013-01-02'" . Pour contourner ce problème, j'ai dû créer un convertisseur pour cette colonne:

def decoder(input_bytes):
    return input_bytes.decode("ascii")

Ce serait bien dans le code de production mais ce n'est pas du tout joli pour le matériel de formation ...

Pousser à 1.11.

solution de contournement - exécutez d'abord iconv sur le fichier.

poussant à 1.12.

Je vois que cela est avancé, mais je trouve que c'est un bogue qui devrait être corrigé, et un correctif semble être facilement implémenté.

Assez choquant que cela n'ait pas été corrigé depuis 5 ans

Il semble que cela fonctionne comme souhaité dans NumPy 1.13.3 (même si je ne suis pas sûr de savoir quel PR l'a corrigé). Ce problème peut-il être résolu?

>>> import io
>>> import numpy as np
>>> f = io.StringIO("7/5/1962\n7/6/1962\n")
>>> np.loadtxt(f, dtype=str)
array(['7/5/1962', '7/6/1962'],
      dtype='<U8')
>>> np.__version__
'1.13.3'

On dirait que cela a été corrigé dans # 8349, en réponse à # 8033.

Fermeture. Veuillez rouvrir si nécessaire.

Cette page vous a été utile?
0 / 5 - 0 notes