Numpy: npyio.loadtxt é a entrada de arquivo de texto de conversão de bytes, mesmo com str dtype especificado.

Criado em 8 nov. 2012  ·  11Comentários  ·  Fonte: numpy/numpy

Meio Ambiente

  • Python: versão 3.3 (lançamento python.org) no OS X Mountain Lion
  • numpy: clonado do git master

Ao chamar numpy.loadtxt em um arquivo contendo strings como segue:

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

Onde NYSE_dates.txt é simplesmente uma lista de datas (pode ser qualquer coisa):

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

O resultado é:

["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 você pode ver, todas as strings foram lançadas em bytes e, em seguida, transformadas em string por meio de conv , pois você obteria o mesmo resultado de str(str('12/31/2020').encode('latin1')) , por conv & compat.asbytes .

Depois de examinar o código, parece que todas as strings são convertidas em bytes com asbytes(...) praticamente por toda parte, como por exemplo em split_line(...) , então isso deve significar que todas as rotinas no módulo estão quebradas.

00 - Bug numpy.lib

Comentários muito úteis

Muito chocante que isso não tenha sido corrigido por 5 anos

Todos 11 comentários

Eu também tenho esse problema. Isso é muito chato; basicamente você não pode usar loadtxt em Python3.

Solução temporária: removi todas as chamadas asbytes () no método loadtxt.

Sim, lembro-me de ter pensado que havia algo suspeito ali quando olhei o código.

Para registro, estou tendo o mesmo problema com entradas datetime64, levando a um erro de análise do formulário: Error parsing datetime string "b'2013-01-02'" . Para contornar isso, tive que criar um conversor para essa coluna:

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

Isso seria bom no código de produção, mas não é nada bonito para o material de treinamento ...

Avançando para 1.11.

solução alternativa - execute primeiro o iconv no arquivo.

empurrando para 1,12.

Vejo que isso está sendo adiado, mas acho que é um bug que deve ser corrigido e uma correção parece ser facilmente implementada.

Muito chocante que isso não tenha sido corrigido por 5 anos

Parece que isso está funcionando como desejado no NumPy 1.13.3 (embora eu não tenha certeza de qual PR corrigiu isso). Este problema pode ser resolvido?

>>> 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 isso foi corrigido em # 8349, em resposta a # 8033.

Fechando. Reabra se necessário.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

dmvianna picture dmvianna  ·  4Comentários

toddrjen picture toddrjen  ·  4Comentários

Kreol64 picture Kreol64  ·  3Comentários

navytux picture navytux  ·  4Comentários

Levstyle picture Levstyle  ·  3Comentários