2010-07-07 47 views
9

Tôi vẫn viết trên giao diện python cho mã c của tôi với ctypes. Hôm nay tôi thay thế chức năng đọc tập tin của tôi với một phiên bản python, được lập trình bởi một người khác sử dụng NumPy. Phiên bản 'cũ' c được gọi với một byref (p_data) trong khi p_data = PFloat() (xem bên dưới). Hàm main lấy p_data.Làm thế nào để sử dụng mảng NumPy với ctypes?

Cũ tập đọc:

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

Các python chức năng tập đọc trên Mặt khác trả về một mảng NumPy. Câu hỏi của tôi bây giờ là:

Làm cách nào để chuyển đổi mảng NumPy thành POINTER (c_float)?

Tôi googled nhưng chỉ tìm thấy những cách khác xung quanh: C arrays through ctypes accessed as NumPy arrays và điều tôi không hiểu: C-Types Foreign Function Interface (numpy.ctypeslib)

[cập nhật] sửa một lỗi trong mã ví dụ

Trả lời

15

Mã của bạn trông giống như nó có một số nhầm lẫn trong đó - ctypes.POINTER() tạo ra một con trỏ ctypes mới lớp, không phải là một ví dụ ctypes. Dù sao, cách dễ nhất để chuyển mảng NumPy sang mã ctypes là sử dụng phương thức 's thuộc tính data_as. Chỉ cần đảm bảo dữ liệu cơ bản là đúng loại đầu tiên. Ví dụ:

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

Cảm ơn! Điều này thực sự hữu ích! –

Các vấn đề liên quan