본문 바로가기
기술관련 기록

numpy array를 ctypes으로 c++에서 사용하는 데, 비상식적으로 동작할 때

by 저녁추천좀 2022. 10. 25.

numpy array는 기본값으로 메모리 상에서 연속적(contigous)이지 않으니

x = np.ascontiguousarray(x)

를 해줘야 c++에서 받았을 때, 상식적으로 동작한다.


numpy array -> c++ double ** -> numpy array

를 ctypes 으로 하는데

 

계속 앞쪽만 나오고 뒤쪽이 짤려서 나왔다. 

 

그래서 데이터 처리 없이

그냥 복사만 했는데도 

같은 현상이 발생 했다. 

위 : 출력, 아래 : 입력

근데 index를 7배로 하면 데이터가 잘 간다. (7, 33216)  array, 근데 그러면 아무리 생각해도 메모리 범위 넘어가는데 돌아가는것도 이상하고 그게 안터지는 것도 이상하고

포인터 다 찍어보고 메모리 복사 방식 참조 방식 다 바꿔봤는데 그대로였다. 

 

아무리 생각해봐도 말도 안되는 상황인 와중에

C++단에서 데이터는 온전한걸 확인해서 ctypes 문젠가 하고 검색해보는데 

 

flags['C_CONTIGUOUS']

이라는 키워드를 보고

설마 설마 어레이가 메모리상에서 연속이 아닌가 싶었는데..

연속이 아니었다. 

 

x = np.ascontiguousarray(x)

를 해줘야 상식적으로 메모리상에 저장된다. 

 

 
 

이전에는 어레이가 그렇게 크지 않아서, (8,1024) 정도, 사용하는데 문제가 없었던것 같다.