2012-01-12 25 views
16

मैं PyTables का उपयोग कर एक HDF5 फ़ाइल में एक numpy multidimensional सरणी कैसे डाल सकता हूं?पायथन: PyTables में एक numpy multidimensional सरणी कैसे स्टोर करें?

जो मैं कह सकता हूं उससे मैं एक पाइटेबल्स तालिका में एक सरणी फ़ील्ड नहीं डाल सकता।

मुझे इस सरणी के बारे में कुछ जानकारी स्टोर करने की आवश्यकता है और उस पर गणितीय गणना करने में सक्षम होना चाहिए।

कोई सुझाव?

+8

, तुम बस सीधे एन डी सरणियों के लिए, आप '' बजाय pytables' की h5py' साथ बेहतर कर रहे हैं की एक बहुत कुछ भंडारण कर रहे हैं। यह 'f.create_dataset (' name ', data = x)' के रूप में सरल है, जहां 'x' आपकी numpy array है और 'f' खुली एचडीएफ फ़ाइल है। 'Pytables' में एक ही चीज़ करना संभव है, लेकिन काफी मुश्किल है। –

+0

जो, +1। मैं लगभग समान टिप्पणी पोस्ट करने वाला था। –

+0

मैंने इसके बारे में सोचा लेकिन pytables में सरणी पर सीधे गणना करने के लिए कुछ विशेषताएं (tables.expr) हैं, क्या मेरे पास h5py के साथ हो सकता है? – scripts

उत्तर

32

वहाँ एक आसान तरीका हो सकता है, लेकिन यह आप इसे कैसे करने के बारे में जाना चाहते हैं, जहाँ तक मैं जानता हूँ कि यह है:

import numpy as np 
import tables 

# Generate some data 
x = np.random.random((100,100,100)) 

# Store "x" in a chunked array... 
f = tables.openFile('test.hdf', 'w') 
atom = tables.Atom.from_dtype(x.dtype) 
ds = f.createCArray(f.root, 'somename', atom, x.shape) 
ds[:] = x 
f.close() 

आप संपीड़न का उपयोग करने के लिए निर्दिष्ट करने के लिए चाहते हैं, पर एक नजर है tables.Filters। जैसे

import numpy as np 
import tables 

# Generate some data 
x = np.random.random((100,100,100)) 

# Store "x" in a chunked array with level 5 BLOSC compression... 
f = tables.openFile('test.hdf', 'w') 
atom = tables.Atom.from_dtype(x.dtype) 
filters = tables.Filters(complib='blosc', complevel=5) 
ds = f.createCArray(f.root, 'somename', atom, x.shape, filters=filters) 
ds[:] = x 
f.close() 

वहाँ शायद इस का एक बहुत का बेहद सरल तरीका है ... मैं एक लंबे समय में तालिका जैसी डेटा के अलावा और कुछ के लिए pytables उपयोग नहीं किया है।

नोट: pytables 3.0 के साथ, f.createCArrayf.create_carray को दिया गया था। यह भी ईमानदारी से सीधे सरणी स्वीकार कर सकते हैं, atom निर्दिष्ट किए बिना,

f.create_carray('/', 'somename', obj=x, filters=filters) 
+0

के कारण बेहतर अनुकूल है धन्यवाद, यह बेकार ढंग से काम करता है !! – scripts

+5

ध्यान दें कि यह अब फ़ाइल ऑब्जेक्ट्स पर create_array विधि का उपयोग करके अधिक सरलता से किया जा सकता है, जैसा कि 'नई सरणी ऑब्जेक्ट्स बनाना' अनुभाग में वर्णित है http://pytables.github.io/usersguide/tutorials.html पर –