2010-07-07 3 views
9

나는 아직도 ctypes를 가진 나의 c 코드를위한 파이썬 인터페이스에 글을 쓰고있다. 오늘은 파이썬 버전으로 파일 읽기 기능을 대체했습니다.이 기능은 타인이 NumPy를 프로그래밍 한 프로그램입니다. 'old'C 버전은 byref (p_data)와 p_data = PFloat() (아래 참조)를 사용하여 호출되었습니다. main 함수는 p_data를 취합니다.NumPy 배열을 ctypes와 함께 사용하는 방법?

오래된 파일 읽기 :

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

반면에 파이썬 파일 읽기 기능이 NumPy와 배열을 반환합니다. 내 질문은 지금 :

어떻게 NumPy 배열을 POINTER (c_float)로 변환합니까?

검색 좀하지만 주변에 다른 방법을 발견 : C arrays through ctypes accessed as NumPy arrays 사물이 이해가되지 않았다 C-Types Foreign Function Interface (numpy.ctypeslib)

이 이 예제 코드에서 실수를 수정 [업데이트]

답변

15

귀하의 코드가 보이는 그것에 약간의 혼란이 있습니다 - ctypes.POINTER()은 새로운 ctypes 포인터 클래스을 생성하고 ctypes 인스턴스는 생성하지 않습니다. 어쨌든 NumPy 배열을 ctypes 코드에 전달하는 가장 쉬운 방법은 numpy.ndarrayctypes 속성의 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

감사합니다. 이것은 정말로 도움이되었다! –

관련 문제