2010-07-07 17 views
9

मैं अभी भी सीटीपी के साथ अपने सी कोड के लिए एक अजगर इंटरफ़ेस पर लिख रहा हूं। आज मैंने अपने फाइल रीडिंग फ़ंक्शन को एक पायथन संस्करण के साथ प्रतिस्थापित किया, जिसे किसी और द्वारा प्रोग्राम किया गया था NumPy। 'पुराना' सी संस्करण को बायफ (p_data) के साथ बुलाया गया था जबकि p_data = PFloat() (नीचे देखें)। मुख्य कार्य p_data लेता है।ctypes के साथ NumPy सरणी का उपयोग कैसे करें?

पुरानी फ़ाइल पढ़ने:

p_data=POINTER(c_float) 
foo.read(filename,byref(p_data)) 
result=foo.pymain(p_data) 

अजगर दूसरी ओर फ़ाइल पढ़ने समारोह एक NumPy सरणी देता है। मेरा सवाल अब है:

मैं एक NumPy सरणी को POINTER (c_float) में कैसे परिवर्तित करूं?

मैं googled लेकिन केवल दूसरी तरह के आसपास पाया: C arrays through ctypes accessed as NumPy arrays और चीजों को मैं नहीं समझ पाए: C-Types Foreign Function Interface (numpy.ctypeslib)

[अद्यतन] उदाहरण कोड में एक गलती को सही

उत्तर

15

आपका कोड यह कैसा दिखता इसमें कुछ भ्रम है - ctypes.POINTER() एक नया ctypes पॉइंटर कक्षा बनाता है, एक प्रकार के उदाहरण नहीं। वैसे भी, ctypes कोड में NumPy सरणी को पास करने का सबसे आसान तरीका numpy.ndarray की ctypes विशेषता का data_as विधि का उपयोग करना है। बस सुनिश्चित करें कि अंतर्निहित डेटा पहले सही प्रकार है। उदाहरण के लिए:

c_float_p = ctypes.POINTER(ctypes.c_float) 
data = numpy.array([[0.1, 0.1], [0.2, 0.2], [0.3, 0.3]]) 
data = data.astype(numpy.float32) 
data_p = data.ctypes.data_as(c_float_p) 
+0

धन्यवाद! यह वास्तव में सहायक था! –

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