Depois de criar uma matriz NumPy e salvá-la como uma variável de contexto do Django, recebo o seguinte erro ao carregar a página da web:
array([ 0, 239, 479, 717, 952, 1192, 1432, 1667], dtype=int64) is not JSON serializable
O que isto significa?
json
módulo. Masnumpy.ndarray
não é um tipo quejson
saiba como lidar. Você precisará escrever seu próprio serializador ou (simplesmente) passarlist(your_array)
para o que estiver escrevendo o json.list(your_array)
nem sempre funciona, pois retorna entradas numpy, não entradas nativas. Use emyour_array.to_list()
vez disso.Respostas:
Eu regularmente "jsonify" np.arrays. Tente usar o método ".tolist ()" nas matrizes primeiro, assim:
Para "desjsonificar" a matriz, use:
fonte
tolist()
.tolist()
leva uma quantidade enorme de tempo quando os dados são grandes.Armazene como JSON um numpy.ndarray ou qualquer composição de lista aninhada.
Saída:
Para restaurar a partir do JSON:
Saída:
fonte
numpy.asarray()
?if isinstance(obj, np.float32) or isinstance(obj, np.float64): return float(obj)
Você pode usar o Pandas :
fonte
pd.DataFrame(your_array).to_json('data.json', orient='split')
.Encontrei a melhor solução se você aninhar matrizes numpy em um dicionário:
Graças a esse cara .
fonte
json
verso, você pode usar o seguintewith open(path, 'r') as f:
data = json.load(f)
:, que retorna um dicionário com seus dados.json
arquivo e depois para desserializar a sua saída você pode usar isto:data = json.loads(data)
Use o
json.dumps
default
kwarg:Na
default
função, verifique se o objeto é do módulo numpy, se for o caso, usendarray.tolist
para umndarray
ou use.item
para qualquer outro tipo específico de numpy.fonte
type(obj).__module__ == np.__name__:
lá? Não seria suficiente verificar a instância?.item
para quase qualquer objeto numpy.default
A função é chamada para todos os tipos desconhecidos quejson.dumps
tentam serializar. não apenasIsso não é suportado por padrão, mas você pode fazê-lo funcionar facilmente! Há várias coisas que você deseja codificar se desejar os mesmos dados exatamente de volta:
obj.tolist()
como os @travelingbones mencionados. Às vezes isso pode ser bom o suficiente.Além disso, sua matriz numpy pode fazer parte da sua estrutura de dados, por exemplo, você possui uma lista com algumas matrizes. Para isso, você pode usar um codificador personalizado, que basicamente faz o acima.
Isso deve ser suficiente para implementar uma solução. Ou você pode usar o json-tricks, que faz exatamente isso (e suporta vários outros tipos) (aviso: eu fiz isso).
Então
fonte
Eu tive um problema semelhante com um dicionário aninhado com alguns numpy.ndarrays nele.
fonte
Você também pode usar o
default
argumento, por exemplo:fonte
Além disso, algumas informações muito interessantes ainda mais sobre listas vs. matrizes em Python ~> Lista Python vs. Matriz - quando usar?
Pode-se observar que, depois de converter minhas matrizes em uma lista antes de salvá-las em um arquivo JSON, na minha implantação agora mesmo assim, depois de ler o arquivo JSON para uso posterior, posso continuar usando-o em uma forma de lista (como em vez de convertê-lo novamente em uma matriz).
E, na verdade, parece melhor (na minha opinião) na tela como uma lista (vírgula separada) versus uma matriz (sem vírgula separada) dessa maneira.
Usando o método .tolist () de @ travelingbones acima, eu tenho usado como tal (capturando alguns erros que encontrei também):
SALVAR DICIONÁRIO
LEIA O DICIONÁRIO
Espero que isto ajude!
fonte
Aqui está uma implementação que funciona para mim e removeu todas as nans (assumindo que sejam objetos simples (lista ou dict)):
fonte
Essa é uma resposta diferente, mas isso pode ajudar a ajudar as pessoas que estão tentando salvar dados e depois lê-los novamente.
Há hickle que é mais rápido que pickle e mais fácil.
Tentei salvar e ler no pickle dump, mas durante a leitura houve muitos problemas e perdi uma hora e ainda não encontrei solução, embora estivesse trabalhando nos meus próprios dados para criar um bot de bate-papo.
vec_x
evec_y
são matrizes numpy:Então você acabou de ler e executar as operações:
fonte
Pode ser simples para loop com tipos de verificação:
fonte
use NumpyEncoder que processará o json dump com sucesso. sem jogar - o array NumPy não é JSON serializável
fonte
TypeError: array ([[0.46872085, 0.67374235, 1.0218339, 0.13210179, 0.5440686, 0.9140083, 0.58720225, 0.2199381]], dtype = float32) não é serializador JSON
O erro acima mencionado foi lançado quando tentei passar a lista de dados para model.predict () quando esperava a resposta no formato json.
Mas, felizmente, encontrei a dica para resolver o erro que estava lançando. A serialização dos objetos é aplicável apenas à conversão a seguir O mapeamento deve ser da seguinte maneira object - dict array - list string - string integer - integer
Se você rolar para cima para ver o número da linha 10 prediction = loaded_model.predict (d) em que essa linha de código estava gerando a saída do tipo array datatype, ao tentar converter a matriz para o formato json, não é possível
Finalmente, encontrei a solução convertendo a saída obtida para a lista de tipos seguindo as linhas de código
Bhoom! finalmente obteve a saída esperada,
fonte