Numpy dizilerini h5py'ye girin ve çıkarın


101

Çıktısı görüntü açıklamasını buraya girinboyutlu bir matris olan ve girişlerinin tümü türden olan bir Python kodum var float. .datDosyayı uzantıyla kaydedersem dosya boyutu 500 MB olur. Kullanmanın h5pydosya boyutunu önemli ölçüde azalttığını okudum . Diyelim ki 2D numpy dizisine sahibim A. Bunu bir h5py dosyasına nasıl kaydederim? Ayrıca, aynı dosyayı nasıl okuyabilirim ve farklı bir koda uyuşmuş bir dizi olarak koyabilirim, çünkü dizi ile manipülasyonlar yapmam gerekir?


4
Uzantıyla nasıl .datkaydediyorsunuz?
jorgeca

@jorgeca: Bunun için sadece yapıyorumnp.savetxt("output.dat",A,'%10.8e')
lovespeed

3
Teşekkürler (uzantı tek başına pek bir şey ifade etmez, ikili, ascii ... olarak depolanabilir). Hdf5'in ekstra özelliklerine ihtiyacınız olmadığı sürece, np.save('output.dat', A)onu ikili biçimde kaydedecek olanı kullanırım (çok daha hızlı, çok daha az alan kullanılır).
jorgeca

@jorgeca, ancak başka bir python betiği, ben onuA = np.loadtxt('output.dat',unpack=True)
lovespeed

2
yani h5pybunlardan daha küçük dosyalar oluşturmaz np.savemı? olduğunu h5pydaha hızlı np.savesoru verilen boyutta diziler için?
dbliss

Yanıtlar:


133

h5py, bir veri kümesi ve grup modeli sağlar . İlki temelde dizilerdir ve ikincisi dizinler olarak düşünebilirsiniz. Her biri adlandırılır. API belgelerine ve örneklere bakmalısınız:

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

Tüm verileri önceden oluşturduğunuz ve sadece bir hdf5 dosyasına kaydetmek istediğiniz basit bir örnek şuna benzer:

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

Daha sonra bu verileri kullanarak tekrar yükleyebilirsiniz: '

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

Kesinlikle dokümanlara göz atın:

http://docs.h5py.org

Hdf5 dosyasına yazma, h5py veya pytables'a bağlıdır (her biri, hdf5 dosya spesifikasyonunun üstüne oturan farklı bir python API'sine sahiptir). Ayrıca numpy tarafından yerel olarak sağlanan np.save, np.savezvb. Gibi diğer basit ikili biçimlere de göz atmalısınız :

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


Btw. Okurken veri setinin adını önceden bilmiyorsanız, hdf dosyasını buraya benzer şekilde ayrıştırmanız gerekir .
Trilarion

Veri kümesine bir sütun eklemek istersem @JoshAdel. veri kümem [img_id, satırlar, sütunlar, kanallar] olarak indekslenmiş çok boyutlu bir np.array. ve cevabınızda açıklanan yöntemi kullanarak onu kaydettim. Veri setindeki tüm noktalara h5f ['dataset_1'] [img_id] kullanarak erişiyorum. istediğim, veri kümesindeki her img_id'ye karşılık gelen 'sütunum' diyen başka bir sütun eklemenin bir yolu. h5f ['sütunum'] [img_id] yapabilmek için buna nasıl başka bir sütun eklemeliyim?
iratzhash

Bu şekilde matrisler yazarsam HDFView 2.11 ile göremiyorum - Dosyayı açabiliyorum, veri setinin data.h5var olduğunu görebiliyorum ama HDFView ile görüntüleyemiyorum. İçeriği h5py ile okuyabiliyorum ancak HDFView ile inceleyemiyorum. Herhangi bir fikrin neden?
Martin Thoma

105

Dosyayı açıp kapatmanın ve bellek sızıntılarını önlemenin daha temiz bir yolu :

Hazırlık:

import numpy as np
import h5py

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

Yazmak:

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

Oku:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]

2
Dosyayı kapatmanıza gerek yok mu?
ricoamor

23
@DrDeSancho hayır, ifade ile
Leonid

1
özellikle etkileşimli modda çalışırken kullanışlıdır (çünkü aksi takdirde kişi ilk denemede düzgün bir şekilde kapatmadan aynı kodu tekrar çalıştırdığında zaten açık olan bir dosya hakkında h5py'den bir istisna alma riski taşır)
Andre Holzner

withPython'un özelliği bağlama yöneticisi olarak bilinir. Kullanıldıktan sonra dosyanın kapatılmasını sağlayacaktır. Resmi belgelerde daha fazla bilgi mevcuttur: docs.python.org/3/library/contextlib.html
Mark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.