2015-11-13 17 views
10

मैं source-code पढ़ रहा हूं जो ज़िप फ़ाइल डाउनलोड करता है और डेटा को numpy array में पढ़ता है। कोड MacOS और लिनक्स पर काम करते हैं और यहाँ के लिए लगता टुकड़ा है कि मैं देख रहा हूँ है:हमें यहां अंतहीनता की आवश्यकता क्यों है?

def _read32(bytestream): 
    dt = numpy.dtype(numpy.uint32).newbyteorder('>') 
    return numpy.frombuffer(bytestream.read(4), dtype=dt) 

इस समारोह निम्नलिखित संदर्भ में प्रयोग किया जाता है:

with gzip.open(filename) as bytestream: 
    magic = _read32(bytestream) 

यह देखने के लिए यहां क्या होता है कठिन नहीं है , लेकिन मैं newbyteorder('>') के उद्देश्य से परेशान हूं। मैंने documentation पढ़ा है, और पता है कि अंतहीनता का मतलब क्या है, लेकिन यह समझ में नहीं आता कि वास्तव में डेवलपर ने न्यूबाइटऑर्डर क्यों जोड़ा (मेरी राय में यह वास्तव में आवश्यक नहीं है)।

उत्तर

7

है कि स्रोत पृष्ठ में वर्णित के रूप क्योंकि डाउनलोड किए गए डेटा बड़ा endian स्वरूप में है: http://yann.lecun.com/exdb/mnist/ फाइलों में

सभी पूर्णांकों पहले MSB में जमा हो जाती (उच्च endian) प्रारूप सबसे गैर इंटेल द्वारा प्रयोग किया जाता प्रोसेसर। इंटेल प्रोसेसर और अन्य लो-एंडियन मशीनों के उपयोगकर्ता शीर्षलेख के बाइट फ़्लिप करना चाहिए।

+0

यदि आप लाइन 45 पर कोड को देखते हैं तो आपको 'data = numpy.frombuffer (buf, dtype = numpy.uint8) 'दिखाई देता है। यह चीजों को थोड़ा सा गड़बड़ कर देता है। कोड की इस पंक्ति में अंतहीनता निर्दिष्ट क्यों नहीं है? – emanuele

+1

क्योंकि डेटा प्रकार 'uint8' केवल 1 बाइट लंबा है। अंतहीनता केवल बहु-बाइट डेटा प्रकारों के लिए सार्थक है। – HeyYO

+0

thanx :) आप सही है – emanuele

3

यह सुनिश्चित करने का एक तरीका है कि बाइट्स को परिणामी सरणी से सही क्रम में व्याख्या किया जाता है, भले ही सिस्टम के मूल बाइटऑर्डर पर ध्यान दिए बिना।

डिफ़ॉल्ट रूप से, निर्मित NumPy पूर्णांक dtypes आपके सिस्टम के मूलभूत बाइटऑर्डर का उपयोग करेगा। उदाहरण के लिए, मेरा सिस्टम थोड़ा-एंडियन है, इसलिए बस टाइपिंग numpy.dtype(numpy.uint32) का उपयोग करने का अर्थ यह होगा कि बड़े-एंडियन ऑर्डर में बाइट्स के साथ बफर से सरणी में पढ़ने वाले मानों का सही अर्थ नहीं लिया जाएगा।

यदि np.frombuffer किसी विशेष बाइटऑर्डर में जाने वाले बाइट्स को प्राप्त करने के लिए है, तो सर्वोत्तम अभ्यास newbyteorder का उपयोग करके dtype को संशोधित करना है। यह documents for np.frombuffer में बताया गया है:

>>> dt = np.dtype(int) 
>>> dt = dt.newbyteorder('>') 
>>> np.frombuffer(buf, dtype=dt) 
: बफर डेटा है कि मशीन बाइट-क्रम में नहीं दे रहा है

नोट्स

हैं, तो यह, उदाहरण के लिए डेटा प्रकार के भाग के रूप निर्दिष्ट किया जाना चाहिए

परिणामी सरणी का डेटा बाइटवॉप्ड नहीं किया जाएगा, लेकिन सही ढंग से व्याख्या किया जाएगा।

संबंधित मुद्दे