Arrays numpy de entrada e saída para h5py

100

Eu tenho um código Python cuja saída é uma insira a descrição da imagem aquimatriz dimensionada, cujas entradas são todas do tipo float. Se eu salvar com a extensão, .dato tamanho do arquivo é da ordem de 500 MB. Eu li que o uso h5pyreduz consideravelmente o tamanho do arquivo. Então, digamos que eu tenha o array numpy 2D nomeado A. Como faço para salvá-lo em um arquivo h5py? Além disso, como faço para ler o mesmo arquivo e colocá-lo como uma matriz numpy em um código diferente, pois preciso fazer manipulações com a matriz?

velocidade do amor
fonte
4
Como você está salvando com a .datextensão?
jorgeca
@jorgeca: por isso eu acabei de fazernp.savetxt("output.dat",A,'%10.8e')
lovespeed
3
Obrigado (a extensão sozinha não significa muito, ela pode ser armazenada como binário, ascii ...). A menos que você precise dos recursos extras do hdf5, eu apenas usaria o np.save('output.dat', A)que o salvará em um formato binário (muito mais rápido, muito menos espaço usado).
jorgeca
@jorgeca, mas será que outro script python será capaz de lê-lo como um array 2D quando eu o chamar deA = np.loadtxt('output.dat',unpack=True)
lovespeed
2
então h5pynão cria arquivos menores do que aqueles np.save? é h5pymais rápido do que np.savepara matrizes do tamanho fornecido na pergunta?
dbliss

Respostas:

131

h5py fornece um modelo de conjuntos de dados e grupos . O primeiro é basicamente arrays e o último você pode pensar em diretórios. Cada um tem um nome. Você deve consultar a documentação da API e exemplos:

http://docs.h5py.org/en/latest/quick.html

Um exemplo simples em que você está criando todos os dados antecipadamente e deseja apenas salvá-los em um arquivo hdf5 seria algo como:

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

Você pode então carregar esses dados de volta usando: '

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

Definitivamente, verifique a documentação:

http://docs.h5py.org

A gravação em arquivo hdf5 depende de h5py ou pytables (cada um possui uma API python diferente que se baseia na especificação do arquivo hdf5). Você também deve dar uma olhada em outros formatos binários simples fornecidas por numpy nativamente tais como np.save, np.savezetc:

http://docs.scipy.org/doc/numpy/reference/routines.io.html

JoshAdel
fonte
Btw. se você não souber o nome do conjunto de dados de antemão durante a leitura, terá que analisar o arquivo hdf semelhante a aqui .
Trilarion
@JoshAdel se eu quiser adicionar uma coluna ao conjunto de dados. meu conjunto de dados é um np.array multidimensional indexado como [img_id, linhas, colunas, canais]. e salvei usando o método descrito em sua resposta. Eu acesso todos os pontos no conjunto de dados usando h5f ['dataset_1'] [img_id]. o que eu quero é uma maneira de adicionar outra coluna, como 'minha coluna' ... correspondendo a cada img_id no conjunto de dados. como devo adicionar outra coluna a isso para que possa fazer h5f ['mycolumn'] [img_id]?
iratzhash
Se eu escrever matrizes como esta, não posso vê-las com HDFView 2.11 - posso abrir o arquivo, posso ver que o conjunto de dados data.h5existe, mas não consigo visualizá-lo com HDFView. Posso ler o conteúdo com h5py, mas não inspecionar com HDFView. Alguma ideia do porquê?
Martin Thoma
104

Uma maneira mais limpa de abrir / fechar arquivos e evitar vazamentos de memória:

Preparação:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

Escrever:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

Ler:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
Lavi Avigdor
fonte
2
Não há necessidade de fechar o arquivo?
ricoamor
23
@DrDeSancho não, a declaração com
Leonid
1
especialmente útil ao executar no modo interativo (porque caso contrário, corre-se o risco de obter uma exceção do h5py sobre um arquivo já aberto quando se executa novamente o mesmo código sem fechar corretamente na primeira tentativa)
Andre Holzner
O withrecurso do Python é conhecido como gerenciador de contexto. Isso garantirá que o arquivo seja fechado depois de usado. Mais informações estão disponíveis na documentação oficial: docs.python.org/3/library/contextlib.html
Marcos