Para uma resposta curta, você deve usar np.save
e np.load
. As vantagens disso é que são feitos por desenvolvedores da biblioteca numpy e já funcionam (e provavelmente já estão bem otimizados).
import numpy as np
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
np.save(path/'x', x)
np.save(path/'y', y)
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
print(x is x_loaded) # False
print(x == x_loaded) # [[ True True True True True]]
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!
import numpy as np
import pickle
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
# using save (to npy), savez (to npz)
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
pickle.dump(obj={'x':x, 'y':y}, file=db_file)
## using loading npy, npz files
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
db_pkl = pickle.load(db_file)
print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')
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
.npz format.
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!)
- O Pickle também permite a execução arbitrária de códigos. Algumas pessoas podem não querer usar isso por motivos de segurança.
- arquivos legíveis por humanos são caros para fazer, etc. Provavelmente não vale a pena.
- há algo chamado
hdf5
para arquivos grandes. Legal! https://stackoverflow.com/a/9619713/1601580
Observe que esta não é uma resposta exaustiva. Mas para outros recursos verifique isto: