Input dan output array numpy ke h5py

100

Saya memiliki kode Python yang outputnya adalah masukkan deskripsi gambar di sinimatriks berukuran, yang semua isinya adalah tipe float. Jika saya menyimpannya dengan ekstensi .datukuran file di urutan 500 MB. Saya membaca bahwa menggunakan sangat h5pymengurangi ukuran file. Jadi, katakanlah saya memiliki array numpy 2D bernama A. Bagaimana cara menyimpannya ke file h5py? Juga, bagaimana cara membaca file yang sama dan meletakkannya sebagai array numpy dalam kode yang berbeda, karena saya perlu melakukan manipulasi dengan array?

kecepatan cinta
sumber
4
Bagaimana Anda menyimpannya dengan .datekstensi?
jorgeca
@jorgeca: untuk itu saya lakukannp.savetxt("output.dat",A,'%10.8e')
lovespeed
3
Terima kasih (ekstensi saja tidak berarti banyak, itu dapat disimpan sebagai biner, ascii ...). Kecuali Anda memerlukan fitur tambahan hdf5, saya hanya akan menggunakan np.save('output.dat', A)yang akan menyimpannya dalam format biner (lebih cepat, lebih sedikit ruang yang digunakan).
jorgeca
@jorgeca tetapi akankah skrip python lain dapat membacanya sebagai array 2D ketika saya menyebutnya sebagaiA = np.loadtxt('output.dat',unpack=True)
lovespeed
2
jadi h5pybukankah membuat file lebih kecil dari itu np.save? adalah h5pylebih cepat dari np.saveuntuk array dari ukuran yang diberikan dalam pertanyaan?
dbliss

Jawaban:

131

h5py menyediakan model kumpulan data dan grup . Yang pertama pada dasarnya adalah array dan yang terakhir dapat Anda anggap sebagai direktori. Masing-masing diberi nama. Anda harus melihat dokumentasi untuk API dan contohnya:

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

Contoh sederhana di mana Anda membuat semua data dimuka dan hanya ingin menyimpannya ke file hdf5 akan terlihat seperti:

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()

Anda kemudian dapat memuat data itu kembali menggunakan: '

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

Lihat dokumennya:

http://docs.h5py.org

Menulis ke file hdf5 bergantung pada h5py atau pytables (masing-masing memiliki API python berbeda yang berada di atas spesifikasi file hdf5). Anda juga harus melihat format biner sederhana lainnya yang disediakan oleh numpy secara native seperti np.save, np.savezdll:

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

JoshAdel
sumber
Btw. jika Anda tidak mengetahui nama dari dataset sebelumnya saat membaca Anda harus mengurai file hdf seperti di sini .
Trilarion
@JoshAdel jika saya ingin menambahkan kolom ke dataset. dataset saya adalah np.array multidimensi yang diindeks sebagai [img_id, baris, kolom, saluran]. dan saya telah menyimpannya menggunakan metode yang dijelaskan dalam jawaban Anda. Saya mengakses semua titik dalam dataset menggunakan h5f ['dataset_1'] [img_id]. yang saya inginkan adalah cara untuk menambahkan kolom lain bertuliskan 'mycolumn' ... sesuai dengan setiap img_id dalam dataset. bagaimana cara menambahkan kolom lain ke sini sehingga saya bisa melakukan h5f ['mycolumn'] [img_id]?
iratzhash
Jika saya menulis matriks seperti ini, maka saya tidak dapat melihatnya dengan HDFView 2.11 - Saya dapat membuka file, saya dapat melihat bahwa kumpulan data tersebut data.h5ada, tetapi saya tidak dapat melihatnya dengan HDFView. Saya bisa membaca isinya dengan h5py, tetapi tidak memeriksanya dengan HDFView. Tahu kenapa?
Martin Thoma
104

Cara yang lebih bersih untuk menangani buka / tutup file dan menghindari kebocoran memori:

Persiapan:

import numpy as np
import h5py

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

Menulis:

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

Baca:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
Lavi Avigdor
sumber
2
Tidak perlu menutup file?
ricoamor
23
@DrDeSancho tidak, pernyataan dengan
Leonid
1
sangat berguna ketika berjalan dalam mode interaktif (karena jika tidak, seseorang berisiko mendapatkan pengecualian dari h5py tentang file yang sudah terbuka ketika seseorang memutar ulang kode yang sama tanpa menutup dengan benar pada upaya pertama)
Andre Holzner
The withfitur Python dikenal sebagai manajer konteks. Ini akan memastikan file ditutup setelah digunakan. Informasi lebih lanjut tersedia di dokumentasi resmi: docs.python.org/3/library/contextlib.html
Tandai