में डेटा प्राप्त करना मैं गणना के एक श्रृंखला को चलाने के लिए एक पायथन (ctypes
) लपेटा सी लाइब्रेरी का उपयोग कर रहा हूं। चलने के विभिन्न चरणों में, मैं पाइथन में डेटा प्राप्त करना चाहता हूं, और विशेष रूप से numpy
सरणी प्राप्त करना चाहता हूं।ctypes सरणी से numpy
रैपिंग मैं उपयोग कर रहा हूँ सरणी डेटा के लिए वापसी (मेरे लिए विशेष रुचि का है जो) दो अलग अलग प्रकार है:
ctypes
सरणी: जब मैंtype(x)
(कर जहां xctypes
है सरणी, मैं बदले में एक<class 'module_name.wrapper_class_name.c_double_Array_12000'>
मिल मुझे पता है कि इस डेटा प्रलेखन से आंतरिक डेटा की एक प्रतिलिपि है और मैं एकnumpy
सरणी में यह आसानी से प्राप्त करने में सक्षम हूँ:।>>> np.ctypeslib.as_array(x)
यह डेटा के 1 डी numpy
सरणी देता है।
ctype
डेटा सूचक: पुस्तकालय के दस्तावेज़ से इस मामले में, मैं समझता हूँ कि मैं संग्रहीत और पुस्तकालय के लिए सीधे इस्तेमाल किया डेटा के लिए सूचक हो रही है। मट्ठा मैंtype(y)
(जहां y सूचक है) मुझे<class 'module_name.wrapper_class_name.LP_c_double'>
मिलता है। इस मामले के साथ मैं अब भीy[0][2]
की तरह डेटा के माध्यम से सूचकांक करने में सक्षम हूँ, लेकिन मैं केवल एक सुपर अजीब के माध्यम से यह numpy में प्राप्त करने में सक्षम था:>>> np.frombuffer(np.core.multiarray.int_asbuffer( ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))
मैं एक पुराने numpy
मेलिंग सूची thread from Travis Oliphant में यह पाया , लेकिन numpy
दस्तावेज में नहीं। इसके बाद के संस्करण के रूप में मैं निम्नलिखित मिलता है इस दृष्टिकोण के बजाय मैं कोशिश:
>>> np.ctypeslib.as_array(y)
...
... BUNCH OF STACK INFORMATION
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'
इस np.frombuffer
सबसे अच्छा या एक ही तरीका है यह करने के लिए दृष्टिकोण है? मैं अन्य सुझावों के लिए खुला हूं लेकिन अभी भी numpy
का उपयोग करना चाहूंगा क्योंकि मेरे पास अन्य पोस्ट-प्रोसेसिंग कोड है जो numpy
कार्यक्षमता पर निर्भर करता है जिसे मैं इस डेटा के साथ उपयोग करना चाहता हूं।
हैं आप नियंत्रण ओ है सी सी lib? क्या आप लाइब्रेरी का एपीआई बदल सकते हैं? –
हां - मेरे पास स्रोत है। मुझे यकीन नहीं है कि किस तरह से जाना है, क्योंकि सूचक दृष्टिकोण पाइथन को डेटा पर सीधे कार्य करने की अनुमति देता है जो मुझे लगता है कि कुछ मामलों में मुझे लगता है कि एक फायदा हो सकता है। हालांकि मेरे मामले में, हाँ, यह सब कुछ होगा कि सब कुछ 'ctype' सरणी के रूप में बाहर आ जाए। कोई सिफारिशें? – dtlussier
मैं लाइब्रेरी में आपके द्वारा पाइथन में आवंटित एक लाइब्रेरी (NumPy-) सरणी का उपयोग करने और लाइब्रेरी पर जाने का सुझाव दूंगा। इस तरह, आप एक ही स्मृति पर कार्य कर सकते हैं, लेकिन आपको किसी भी अजीब रूपांतरण करने की परेशानी नहीं है। आपके पास पहले से एक NumPy सरणी है, और इसे लाइब्रेरी में पास करना ['numpy.ctypeslib.ndpointer'] (http://docs.scipy.org/doc/numpy/reference/routines.ctypeslib.html का उपयोग करके अच्छी तरह से समर्थित है) # numpy.ctypeslib.ndpointer) आपके फ़ंक्शन के ctypes wrapper के लिए तर्क प्रकार के रूप में। (यदि यह स्पष्ट नहीं है, तो बस पूछें ...) –