Numpy: npyio.loadtxt es una entrada de archivo de texto de conversión de bytes, incluso con str dtype especificado.

Creado en 8 nov. 2012  ·  11Comentarios  ·  Fuente: numpy/numpy

Medio ambiente

  • Python: Versión 3.3 (lanzamiento de python.org) en OS X Mountain Lion
  • numpy: clonado de git master

Al llamar a numpy.loadtxt en un archivo que contiene cadenas de la siguiente manera:

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

Donde NYSE_dates.txt es simplemente una lista de fechas (podría ser cualquier cosa en realidad):

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

La salida es:

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

Como puede ver, todas las cadenas se han convertido en bytes, luego en cadenas a través de conv , ya que obtendría el mismo resultado de str(str('12/31/2020').encode('latin1')) , por conv y compat.asbytes .

Después de mirar el código, parece que todas las cadenas tienen bytes de conversión con asbytes(...) prácticamente en todo momento, como por ejemplo en split_line(...) , por lo que esto debe significar que todas las rutinas del módulo están rotas.

00 - Bug numpy.lib

Comentario más útil

Es bastante impactante que esto no se haya solucionado durante 5 años

Todos 11 comentarios

También tengo ese problema. Esto es muy, muy molesto; básicamente no puedes usar loadtxt en Python3.

Solución temporal: eliminé todas las llamadas asbytes () en el método loadtxt.

Sí, recuerdo haber pensado que había algo sospechoso allí cuando miré el código.

Para que conste, me encuentro con el mismo problema con las entradas datetime64, lo que lleva a un error de análisis de la forma: Error parsing datetime string "b'2013-01-02'" . Para solucionar esto, tuve que crear un convertidor para esa columna:

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

Esto estaría bien en el código de producción, pero es muy poco atractivo para el material de capacitación ...

Empujando a 1,11.

solución alternativa: primero ejecute iconv en el archivo.

empujando a 1.12.

Veo que esto se está impulsando, pero encuentro que es un error que debería abordarse, y una solución parece implementarse fácilmente.

Es bastante impactante que esto no se haya solucionado durante 5 años

Parece que esto está funcionando como se desea en NumPy 1.13.3 (aunque no estoy seguro de qué PR lo solucionó). ¿Se puede solucionar este problema?

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

Parece que esto se solucionó en el # 8349, en respuesta al # 8033.

Clausura. Vuelva a abrir si es necesario.

¿Fue útil esta página
0 / 5 - 0 calificaciones