Eu me pergunto, como salvar e carregar numpy.array
dados corretamente. Atualmente estou usando o numpy.savetxt()
método. Por exemplo, se eu obtiver uma matriz markers
, que se parece com isto:
Tento salvá-lo usando:
numpy.savetxt('markers.txt', markers)
Em outro script, tento abrir o arquivo salvo anteriormente:
markers = np.fromfile("markers.txt")
E é isso que eu ganho ...
Os dados salvos têm a seguinte aparência:
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
Mas quando eu salvo apenas os dados carregados pelo uso do mesmo método, ou seja. numpy.savetxt()
Se parece com isso:
1.398043286095131769e-76
1.398043286095288860e-76
1.396426376485745879e-76
1.398043286055061908e-76
1.398043286095288860e-76
1.182950697433698368e-76
1.398043275797188953e-76
1.398043286095288860e-76
1.210894289234927752e-99
1.398040649781712473e-76
O que estou fazendo de errado? PS, não há nenhuma outra operação "backstage" que eu execute. Basta salvar e carregar, e é isso que recebo. Agradeço antecipadamente.
np.save()
enp.load()
.scipy.io.savemat
escipy.io.loadmat
.fromfile
é ler os dados como binários.loadtxt
é o emparelhamento correto comsavetxt
. Veja a documentação da função.Respostas:
A maneira mais confiável que descobri de fazer isso é usar
np.savetxt
comnp.loadtxt
e não anp.fromfile
que é mais adequada para arquivos binários gravados comtofile
. Os métodosnp.fromfile
enp.tofile
escrevem e leem arquivos binários enquantonp.savetxt
grava um arquivo de texto. Então, por exemplo:Ou:
Eu uso o método anterior, mesmo que seja mais lento e crie arquivos maiores (às vezes): o formato binário pode ser dependente da plataforma (por exemplo, o formato do arquivo depende do endianness do seu sistema).
Existe um formato independente de plataforma para matrizes NumPy, que podem ser salvas e lidas com
np.save
enp.load
:fonte
.npy
arquivos (por exemplo, gerados pornp.save()
) são independentes da plataforma e serão mais compactos e rápidos de criar do que arquivos de texto.np.savez
se você quiser a saída compactada.np.savez
salva vários arrays descompactados -np.savez_compressed
irá compactá-los - não há nenhumnp.save_compressed
ainda. Consulte docs.scipy.org/doc/numpy-1.15.1/reference/routines.io.htmlfonte
pickle
?x = db["x"]
seguido pory = db["y"]
?np.fromfile()
tem umsep=
argumento de palavra - chave:O valor padrão de
sep=""
significa quenp.fromfile()
tenta lê-lo como um arquivo binário em vez de um arquivo de texto separado por espaços, portanto, você obtém valores sem sentido de volta. Se utilizarnp.fromfile('markers.txt', sep=" ")
, obterá o resultado que procura.No entanto, como outros apontaram,
np.loadtxt()
é a maneira preferida de converter arquivos de texto em matrizes numpy e, a menos que o arquivo precise ser legível por humanos, geralmente é melhor usar formatos binários (por exemplo,np.load()
/np.save()
).fonte
pickle
?Para uma resposta curta, você deve usar
np.save
enp.load
. As vantagens disso é que são feitos por desenvolvedores da biblioteca numpy e já funcionam (e provavelmente já estão bem otimizados).Resposta expandida:
No final, isso realmente depende de suas necessidades porque você também pode salvá-lo em um formato legível por humanos (veja este Despejar um array NumPy em um arquivo csv ) ou até mesmo com outras bibliotecas se seus arquivos forem extremamente grandes (veja esta melhor maneira de preservar arrays numpy no disco para uma discussão expandida).
No entanto, (fazendo uma expansão, já que você usa a palavra "corretamente" em sua pergunta), ainda acho que usar a função numpy pronta para uso (e a maioria dos códigos!) Provavelmente satisfará a maioria das necessidades do usuário. O motivo mais importante é que já funciona . Tentar usar outra coisa por qualquer outro motivo pode levá-lo a uma inesperada LONGA toca do coelho para descobrir por que não funciona e forçar o funcionamento.
Tomemos, por exemplo, tentar salvá-lo com picles. Eu tentei isso apenas por diversão e levei pelo menos 30 minutos para perceber que pickle não salvaria minhas coisas a menos que eu abrisse e lesse o arquivo no modo bytes com
wb
. Demorei para pesquisar no Google, tentar algo, entender a mensagem de erro etc ... Pequenos detalhes, mas o fato de já ter exigido que eu abrisse um arquivo complicou as coisas de maneiras inesperadas. Para adicionar isso, foi necessário reler isso (o que, aliás, é meio confuso). Diferença entre os modos a, a +, w, w + e r + na função aberta embutida? .Portanto, se houver uma interface que atenda às suas necessidades, use-a a menos que tenha um ( muito ) bom motivo (por exemplo, compatibilidade com matlab ou por algum motivo, você realmente deseja ler o arquivo e imprimir em python realmente não atende às suas necessidades, o que pode ser questionável). Além disso, provavelmente, se você precisar otimizá-lo, você descobrirá mais tarde (em vez de passar séculos depurando coisas inúteis, como abrir um arquivo simples).
Portanto, use a interface / numpy fornecer . Pode não ser perfeito, é provavelmente bom, especialmente para uma biblioteca que existe há tanto tempo quanto entorpecida.
Eu já gastei várias maneiras de salvar e carregar dados com o numpy, então divirta-se com isso, espero que ajude!
Alguns comentários sobre o que aprendi:
np.save
como esperado, isso já o compacta bem (consulte https://stackoverflow.com/a/55750128/1601580 ), funciona imediatamente, sem qualquer abertura de arquivo. Limpar \ limpo. Fácil. Eficiente. Use-o.np.savez
usa um formato descompactado (veja os documentos )Save several arrays into a single file in uncompressed
.npzformat.
Se você decidir usar isso (você foi avisado para abandonar a solução padrão, então espere erros!), você pode descobrir que precisa usar nomes de argumento para salvá-lo, a menos que queira use os nomes padrão. Portanto, não use isso se o primeiro já funcionar (ou se alguma obra usar isso!)hdf5
para arquivos grandes. Legal! https://stackoverflow.com/a/9619713/1601580Observe que esta não é uma resposta exaustiva. Mas para outros recursos verifique isto:
np.save
): Salve Numpy Array usando Picklefonte