इनपुट और आउटपुट h5py करने के लिए सुन्न सरणियों


100

मेरे पास एक पायथन कोड है जिसका आउटपुट एक यहां छवि विवरण दर्ज करेंआकार मैट्रिक्स है, जिसकी प्रविष्टियां सभी प्रकार की हैं float। यदि मैं इसे एक्सटेंशन .datके साथ सहेजता हूं तो फ़ाइल का आकार 500 एमबी के क्रम का है। मैंने पढ़ा कि h5pyफ़ाइल का आकार कम करने से काफी फायदा होता है। तो, चलो कहते हैं कि मेरे पास 2 डी का नाम है A। मैं इसे h5py फ़ाइल में कैसे सहेज सकता हूं? इसके अलावा, मैं एक ही फाइल को कैसे पढ़ूं और इसे अलग कोड में एक सुव्यवस्थित सरणी के रूप में रखूं, क्योंकि मुझे सरणी के साथ हेरफेर करने की आवश्यकता है?


4
आप इसे .datएक्सटेंशन के साथ कैसे बचा रहे हैं ?
जोर्गेका

@ जोर्गेका: इसके लिए मैं सिर्फ करता हूंnp.savetxt("output.dat",A,'%10.8e')
लवपेड को

3
धन्यवाद (विस्तार अकेले ज्यादा मायने नहीं रखता है, इसे बाइनरी, एएससीआई ...) के रूप में संग्रहीत किया जा सकता है। जब तक आपको hdf5 की अतिरिक्त सुविधाओं की आवश्यकता नहीं है, मैं बस इसका उपयोग np.save('output.dat', A)करूंगा जो इसे एक द्विआधारी प्रारूप में बचाएगा (बहुत तेज, बहुत कम स्थान का उपयोग किया जाता है)।
जोर्गेका

@ जोर्जेका लेकिन एक और अजगर लिपि इसे 2 डी ऐरे के रूप में पढ़ सकेगी जब मैं इसे कॉल A = np.loadtxt('output.dat',unpack=True)
करूंगा

2
इसलिए h5pyउन लोगों की तुलना में छोटी फाइलें नहीं बनाता है np.save? है h5pyतेजी से np.saveआकार प्रश्न में दिए गए के एरे के लिए?
dbliss

जवाबों:


131

h5py डेटासेट और समूहों का एक मॉडल प्रदान करता है । पूर्व मूल रूप से सरणियाँ है और बाद में आप निर्देशिकाओं के रूप में सोच सकते हैं। प्रत्येक का नाम है। आपको एपीआई और उदाहरण के लिए प्रलेखन को देखना चाहिए:

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

एक सरल उदाहरण जहां आप सभी डेटा को आगे बढ़ा रहे हैं और बस इसे hdf5 फ़ाइल में सहेजना चाहते हैं, कुछ इस तरह दिखाई देगा:

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

आप उस डेटा को वापस प्रयोग में ला सकते हैं: '

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

डॉक्स को निश्चित रूप से देखें:

http://docs.h5py.org

Hdf5 फ़ाइल पर लिखना h5py या pytables पर निर्भर करता है (प्रत्येक के पास एक अलग अजगर एपीआई है जो hdf5 फ़ाइल विनिर्देश के शीर्ष पर बैठता है)। आपको अन्य सरल द्विआधारी स्वरूपों पर भी एक नज़र डालनी चाहिए जो कि खसखस ​​द्वारा प्रदान किए गए जैसे कि np.save, np.savezआदि:

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


Btw। यदि आप पहले से ही डेटासेट का नाम नहीं जानते हैं तो पढ़ते समय आपको यहाँ के समान एचडीएफ फाइल को पार्स करना होगा ।
त्रिशूल

@JoshAdel अगर मैं डेटासेट में एक कॉलम जोड़ना चाहता हूं। मेरा डेटासेट एक बहुआयामी np.array है जिसे [img_id, row, colums, चैनल] के रूप में अनुक्रमित किया गया है। और मैंने आपके उत्तर में वर्णित विधि का उपयोग करके इसे बचाया है। मैं डेटासेट में h5f ['डेटासेट_1'] [img_id] का उपयोग करके सभी बिंदुओं तक पहुँचता हूँ। मैं जो चाहता हूं वह एक और कॉलम जोड़ने का एक तरीका है, जो 'mycolumn' कहता है ... डेटासेट में हर img_id के अनुरूप है। मुझे इसमें एक और कॉलम कैसे जोड़ना चाहिए ताकि मैं h5f ['mycolumn'] [img_id] कर सकूं?
iratzhash

अगर मैं इस तरह से मैट्रिसेस लिखता हूं, तो मैं उन्हें HDFView 2.11 के साथ नहीं देख सकता हूं - मैं फाइल खोल सकता हूं, मैं देख सकता हूं कि डेटासेट data.h5मौजूद है, लेकिन मैं इसे HDFView के साथ नहीं देख सकता। मैं h5py के साथ सामग्री पढ़ सकता हूं, लेकिन HDFView के साथ इसका निरीक्षण नहीं कर सकता। कोई विचार क्यों?
मार्टिन थोमा

104

फ़ाइल को खोलने / बंद करने और मेमोरी लीक से बचने के लिए एक क्लीनर तरीका :

तैयारी:

import numpy as np
import h5py

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

लिखो:

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

पढ़ें:

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

2
फाइल बंद करने की जरूरत नहीं?
रिकोमर


1
इंटरेक्टिव मोड में चलने पर विशेष रूप से उपयोगी है (क्योंकि अन्यथा एक पहले से खुली हुई फ़ाइल के बारे में h5py से एक अपवाद प्राप्त करने का जोखिम तब होता है जब कोई पहले प्रयास में ठीक से बंद किए बिना एक ही कोड फिर से जमा करता है)
आंद्रे होल्जनर

withपायथन की विशेषता को संदर्भ प्रबंधक के रूप में जाना जाता है। यह सुनिश्चित करेगा कि फ़ाइल का उपयोग करने के बाद उसे बंद कर दिया गया है। अधिक जानकारी आधिकारिक दस्तावेज में उपलब्ध है: docs.python.org/3/library/contextlib.html
मार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.