2012-09-17 11 views
6

मैं पीईपी 3118 के खराब कार्यान्वयन के आसपास अपने सिर को लपेटने की कोशिश कर रहा हूं। संख्या में बफर का उपयोग वास्तव में कैसे काम करता है।numpy.getbuffer और numpy.frombuffer

>>> p = numpy.getbuffer(numpy.arange(10)) 
>>> p 
<read-write buffer for 0x1003e5b10, size -1, offset 0 at 0x1016ab4b0> 
>>> numpy.frombuffer(p) 
array([ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324, 
    1.48219694e-323, 1.97626258e-323, 2.47032823e-323, 
    2.96439388e-323, 3.45845952e-323, 3.95252517e-323, 
    4.44659081e-323]) 

तो मुझे अप्रत्याशित रिटर्न मिल रहा है। मैं 0-9 से 10 तत्वों के साथ एक सरणी देखने की उम्मीद करता हूं। मैं सरणी में जा सकता हूं और पढ़/लिख सकता हूं।

>>> j = numpy.frombuffer(p) 
>>> j 
array([ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324, 
    1.48219694e-323, 1.97626258e-323, 2.47032823e-323, 
    2.96439388e-323, 3.45845952e-323, 3.95252517e-323, 
    4.44659081e-323]) 
>>> j += 1 
>>> j 
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) 

तो ऐसा लगता है कि बफर सभी शून्यों को प्रारंभ कर रहा है, जिसे मैं लिख सकता हूं। मैं जिस कार्यक्षमता की अपेक्षा कर रहा हूं वह है गेटबफर के साथ सीधे बफर पर सरणी (आंगन या आश्रय के साथ) बनाने में सक्षम होना। क्या यह संभव नहीं है?

उत्तर

14

आपके पास एक साधारण dtype समस्या है। क्योंकि np.arange डिफ़ॉल्ट रूप से dtype=int का उपयोग करता बफर आप

np.getbuffer(np.arange(10)) 

साथ बनाने के लिए, एक dtype=int है।

फिर

, जब आप np.frombuffer की dtype=float डिफ़ॉल्ट का उपयोग कर आप वास्तव में कर रहे हैं

np.frombuffer(p) 

के साथ अपने बफर पढ़ने के लिए प्रयास करें। इसके बजाय,

np.frombuffer(p, dtype=int) 

एट देखा उपयोग करते हैं, आप

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
8

मिल मुझे पियरे द्वारा उत्कृष्ट मौजूदा answer करने के लिए कुछ टिप्पणी जोड़ें।

आप getbuffer जरूरत है आप काट करने के लिए है ही अगर एक ndarray: आप data विशेषता

>>> import numpy as np 
>>> a = np.arange(10) 
>>> a.data == np.getbuffer(a) 
True 

इसके विपरीत के माध्यम से अजगर बफर पूरे सरणी के साथ जुड़े वस्तु प्राप्त कर सकते हैं, तो आप एक पारित करने के लिए की जरूरत नहीं है frombuffer फ़ंक्शन पर वास्तविक बफर ऑब्जेक्ट, buffer इंटरफ़ेस का खुलासा करने वाली प्रत्येक वस्तु अच्छी है।

>>> np.frombuffer(a, a.dtype) 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> np.frombuffer(a) 
array([ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324, 
     1.48219694e-323, 1.97626258e-323, 2.47032823e-323, 
     2.96439388e-323, 3.45845952e-323, 3.95252517e-323, 
     4.44659081e-323]) 
>>> import array 
>>> c = array.array('i', range(10)) 
>>> np.frombuffer(c, np.int32) 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32) 
>>> np.frombuffer(c) 
array([ 2.12199579e-314, 6.36598737e-314, 1.06099790e-313, 
     1.48539705e-313, 1.90979621e-313]) 

डिकोडिंग एक बफर वस्तु, आप सही dtype के रूप में ऊपर दिए गए उदाहरणों का प्रदर्शन जानने की आवश्यकता है। अधिक सटीक होने के लिए, बफर ऑब्जेक्ट्स में dtype नहीं है: वे केवल बाइनरी डेटा की एक स्ट्रीम हैं। इसके बजाय ndarray ऑब्जेक्ट्स में dtype है जो निर्देश देता है कि अंतर्निहित बाइनरी डेटा का अर्थ कैसे लिया जाता है।

अपने प्रश्न का उत्तर देने के लिए: प्रत्येक numpy ndarray बफर इंटरफेस का खुलासा करता है। आप data डिस्क्रिप्टर या getbuffer फ़ंक्शन के माध्यम से बफर या इसका एक टुकड़ा एक्सेस कर सकते हैं। आप frombuffer फ़ंक्शन के माध्यम से बफर इंटरफ़ेस को उजागर करने वाली ऑब्जेक्ट से ndarray बना सकते हैं। चूंकि बफर (ndarrays के विपरीत) dtype जानकारी नहीं है, आपको हमेशा स्पष्ट रूप से निर्दिष्ट करना चाहिए कि बफर को dtype तर्क frombuffer पर तर्क के साथ कैसे समझा जाना चाहिए।

+0

पियरे के जवाब में कितना अद्भुत परिशिष्ट।अतिरिक्त विवरण की सराहना की जाती है। – Jzl5325

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

  • कोई संबंधित समस्या नहीं^_^