2015-05-21 11 views
14

क्या यह पहले से मौजूद मौजूदा npy-file --- को np.save(filename,arr,mode='a') जैसा जोड़ना एक numpy सरणी को सहेजना संभव है?एपेंड मोड में numpy सरणी को सहेजें

मेरे पास कई फ़ंक्शन हैं जिन्हें बड़ी सरणी की पंक्तियों पर फिर से चलाना है। मैं मेमोरी बाधाओं के कारण एक बार सरणी नहीं बना सकता। पंक्तियों को बार-बार बनाने से बचने के लिए, मैं एक बार प्रत्येक पंक्ति बनाना चाहता था और इसे फ़ाइल में पिछली पंक्ति में जोड़ने के लिए फ़ाइल को सहेजना चाहता था। बाद में मैं mmap_mode में npy-file लोड कर सकता था, आवश्यक होने पर स्लाइस तक पहुंच सकता था।

उत्तर

8

बिल्ड-इन .npy फ़ाइल प्रारूप छोटे डेटासेट के साथ काम करने के लिए बिल्कुल ठीक है, अन्य बाहरी मॉड्यूल पर निर्भर किए बिना numpy

हालांकि, जब आप बड़ी मात्रा में डेटा शुरू करते हैं, तो ऐसे डेटासेट को संभालने के लिए डिज़ाइन किए गए एचडीएफ 5 जैसे फ़ाइल प्रारूप का उपयोग [1] को प्राथमिकता दी जानी चाहिए।

उदाहरण के लिए, नीचे PyTables साथ HDF5 में numpy सरणियों को बचाने के लिए एक समाधान,

चरण 1 है: एक बढ़ाई EArray भंडारण बनाएं

import tables 
import numpy as np 

filename = 'outarray.h5' 
ROW_SIZE = 100 
NUM_COLUMNS = 200 

f = tables.open_file(filename, mode='w') 
atom = tables.Float64Atom() 

array_c = f.create_earray(f.root, 'data', atom, (0, ROW_SIZE)) 

for idx in range(NUM_COLUMNS): 
    x = np.random.rand(1, ROW_SIZE) 
    array_c.append(x) 
f.close() 

चरण 2: एक मौजूदा पंक्तियों को संलग्न डेटासेट (यदि आवश्यक हो)

f = tables.open_file(filename, mode='a') 
f.root.data.append(x) 

चरण 3: डेटा

f = tables.open_file(filename, mode='r') 
print(f.root.data[1:10,2:20]) # e.g. read from disk only this part of the dataset 
+3

धन्यवाद। मेरे उद्देश्य के लिए ऐरे वर्ग का उपयोग करके थोड़ा सा सरल दृष्टिकोण पर्याप्त था। मैं उत्सुक हूं कि 'np.save' के लिए कोई एपेंड मोड क्यों नहीं है। अगर यह समझदार होगा, मुझे लगता है कि यह लागू किया गया होगा। – user3820991

+0

क्या यह अभी भी 2018 में सबसे अच्छी विधि है? – Moondra

3

numpy.save का उपयोग कर पहले से मौजूद किसी फाइल करने के लिए डेटा जोड़कर के लिए के एक सबसेट वापस पढ़ें, हम का उपयोग करना चाहिए:

f_handle = file(filename, 'a') 
numpy.save(f_handle, arr) 
f_handle.close() 

मैं यह है कि जाँच की है अजगर 2.7 और numpy में काम करता है 1.10.4

मैं कोड पाया here

+3

मैंने अभी जांच की है और यह 'पायथन 2.7.12' और' numpy 1.12.1' में काम नहीं करता है। सरणी बस वही रहता है, कुछ भी जोड़ा नहीं जाता है।यह भी ध्यान रखें कि आपके द्वारा प्रदान किया गया लिंक 'savetxt' विधि के बारे में बात करता है, न कि' np.save'। –

+1

मैं इस प्रकार के स्टैकिंग पैटर्न का सफलतापूर्वक पाइथन 3.5 और numpy 1.11.3 के साथ उपयोग करने में सक्षम हूं। हालांकि फ़ाइल को बाइनरी मोड में खोलना आवश्यक था। – PaxRomana99

0

.npy फाइलों में हेडर होता है जिसमें इसमें सरणी का आकार और प्रकार होता है। यदि आप जानते हैं कि आपका परिणामी सरणी कैसा दिखता है, तो आप हेडर लिख सकते हैं और फिर डेटा में डेटा लिख ​​सकते हैं।

import numpy as np 
import numpy.lib.format as fmt 

def get_header(fnames): 
    dtype = None 
    shape_0 = 0 
    shape_1 = None 
    for i, fname in enumerate(fnames): 
     m = np.load(fname, mmap_mode='r') # mmap so we read only header really fast 
     if i == 0: 
      dtype = m.dtype 
      shape_1 = m.shape[1] 
     else: 
      assert m.dtype == dtype 
      assert m.shape[1] == shape_1 
     shape_0 += m.shape[0] 
    return {'descr': fmt.dtype_to_descr(dtype), 'fortran_order': False, 'shape': (shape_0, shape_1)} 

def concatenate(res_fname, input_fnames): 
    header = get_header(input_fnames) 
    with open(res_fname, 'wb') as f: 
     fmt.write_array_header_2_0(f, header) 
     for fname in input_fnames: 
      m = np.load(fname) 
      f.write(m.tostring('C')) 

आप (जगह में, जबकि जोड़कर संपादित हेडर) एक अधिक सामान्य समाधान की जरूरत है आप की तरह fseek चाल का सहारा लेना होगा [1]: उदाहरण के लिए, यहाँ 2d मैट्रिक्स श्रृंखलाबद्ध के लिए कोड है। https://mail.scipy.org/pipermail/numpy-discussion/2009-August/044570.html (बॉक्स से बाहर काम नहीं करता है)
[2]:

द्वारा
[1] प्रेरित होकर https://docs.scipy.org/doc/numpy/neps/npy-format.html
[3]: मुझे PyTables की ओर इशारा करते के लिए https://github.com/numpy/numpy/blob/master/numpy/lib/format.py