मैं अपने प्रोजेक्ट में numpy.save और numpy.load से R/W बड़े डेटासेट का उपयोग करता हूं। मैंने महसूस किया कि numpy.save एपेंड मोड लागू नहीं करता है। उदाहरण के लिए (पायथन 3):

import numpy as np

n = 5
dim = 5
for _ in range(3):
    Matrix = np.random.choice(np.arange(10, 40, dim), size=(n, dim))
    np.save('myfile', Matrix)

M1 = np.load('myfile.npy', mmap_mode='r')[1:7].copy()
print(M1)

स्लाइसिंग [1:7] का उपयोग करके डेटा के विशिष्ट भाग को लोड करना सही नहीं है क्योंकि np.save संलग्न नहीं होता है। मुझे यह उत्तर मिला लेकिन यह अजीब लग रहा है ( file(filename, 'a') फ़ाइल क्या है file??)। क्या अतिरिक्त सूचियों का उपयोग किए बिना इसे प्राप्त करने के लिए कोई चतुर समाधान है?

0
Justin 27 मार्च 2018, 23:38

3 जवाब

सबसे बढ़िया उत्तर

npy फ़ाइल स्वरूप उस तरह से काम नहीं करता है। एक npy फ़ाइल एक एकल सरणी को एन्कोड करती है, जिसमें हेडर आकार, प्रकार और अन्य मेटाडेटा निर्दिष्ट करता है। आप npy फ़ाइल स्वरूप विनिर्देश देख सकते हैं NumPy डॉक्स में।

डेटा जोड़ने के लिए समर्थन npy प्रारूप का डिज़ाइन लक्ष्य नहीं था। भले ही आप सामग्री को अधिलेखित करने के बजाय किसी मौजूदा फ़ाइल में संलग्न करने के लिए numpy.save प्राप्त करने में कामयाब रहे, परिणाम एक मान्य npy फ़ाइल नहीं होगा। अतिरिक्त डेटा के साथ एक वैध npy फ़ाइल बनाने के लिए शीर्षलेख को फिर से लिखना होगा, और चूंकि इसके लिए शीर्षलेख का आकार बदलने की आवश्यकता हो सकती है, यह डेटा को स्थानांतरित कर सकता है और पूरी फ़ाइल को फिर से लिखने की आवश्यकता होती है।

NumPy के पास मौजूदा npy फ़ाइलों में डेटा जोड़ने के लिए कोई उपकरण नहीं है, डेटा को मेमोरी में पढ़ने, एक नई सरणी बनाने और फ़ाइल में नई सरणी लिखने के अलावा। यदि आप अधिक डेटा सहेजना चाहते हैं, तो एक नई फ़ाइल लिखने पर विचार करें, या कोई भिन्न फ़ाइल स्वरूप चुनें।

1
user2357112 supports Monica 27 मार्च 2018, 21:00

file फ़ंक्शन को पायथन 3 में हटा दिया गया था। हालांकि मैं इसकी गारंटी नहीं दूंगा कि यह काम करता है, आपके प्रश्न में लिंक में कोड के बराबर पायथन 3 कोड होगा

with open('myfile.npy', 'ab') as f_handle:
    np.save(f_handle, Matrix)

इसके बाद Matrix को 'myfile.npy' में जोड़ देना चाहिए।

0
jmd_dk 27 मार्च 2018, 21:01

Python3 में save और load को एक ही ओपन फाइल में दोहराया जाता है:

In [113]: f = open('test.npy', 'wb')
In [114]: np.save(f, np.arange(10))
In [115]: np.save(f, np.zeros(10))
In [116]: np.save(f, np.ones(10))
In [117]: f.close()
In [118]: f = open('test.npy', 'rb')
In [119]: for _ in range(3):
     ...:     print(np.load(f))
     ...:     
[0 1 2 3 4 5 6 7 8 9]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
In [120]: np.load(f)
OSError: Failed to interpret file <_io.BufferedReader name='test.npy'> as a pickle

प्रत्येक save फ़ाइल में डेटा का एक स्वयं निहित ब्लॉक लिखता है। इसमें एक हेडर ब्लॉक और डेटाबफ़र की एक छवि होती है। हेडर ब्लॉक में डेटाबफ़र की लंबाई के बारे में जानकारी होती है।

प्रत्येक लोड परिभाषित हेडर ब्लॉक और डेटा बाइट्स की ज्ञात संख्या को पढ़ता है।

जहां तक ​​​​मुझे पता है कि यह दस्तावेज नहीं है, लेकिन पिछले SO प्रश्नों में प्रदर्शित किया गया है। यह save और load कोड से भी स्पष्ट होता है।

ध्यान दें कि ये अलग-अलग सरणियाँ हैं, बचत और लोडिंग दोनों पर। लेकिन अगर आयाम संगत हैं तो हम लोड को एक फ़ाइल में जोड़ सकते हैं।

In [122]: f = open('test.npy', 'rb')
In [123]: np.stack([np.load(f) for _ in range(3)])
Out[123]: 
array([[0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
In [124]: f.close()

अजगर में एक बड़ी numpy फ़ाइल में एकाधिक numpy फ़ाइलें जोड़ें

एपेंड मोड में numpy.save का उपयोग करके सहेजे गए सरणियों को लोड करना

1
hpaulj 27 मार्च 2018, 23:55