2017-03-10 5 views
0

나는 내가 알고있는 dtype = 'object'로 선언 한 혼합 유형의 2 차원 Numpy 배열을 가지고 있습니다. 용도. 사이 썬 래퍼 void **로 혼합 유형의 Cython 2-D numpy 배열

arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O') 

는 I는 C++ 측 함수 특성을 만족시키기 위하여 공극 ** 배열이 2-D 어레이를 변환 할 필요가있다. 나는 dtype = 'O'을 선택했기 때문에 할당 된 메모리가 내가 필요로하는 것보다 더 커질 것이고 현재의 형태로 함수에 제대로 전달되지 않는다는 것을 알고 있습니다.

두 번째 차원의 배열 형식은 항상 일관되고 데이터 구조에 전달되는 다른 정보를 통해 이러한 형식이 무엇인지 알 수 있습니다. 그때 numpy.asarray을 사용하여 보조 배열의 각을 변환하고 해당 void*

arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O') 
num_entries = arr.shape[1] 
cdef void** ptr_arr = <void**> malloc(arr.shape[0]*sizeof(void*)) 
cdef np.ndarray this_arr 

cdef DataType type 

for i in range(num_entries): 
    type = get_type(tags[i]) # this is where the data's dtype is collected 
    ### i = 0 -> dtype is int i = 1 -> dtype is 'S6' ### 
    this_arr = np.asarray(arr[i], dtype = type) 
    ptr_arr[i] = <void*> this_arr.data 

설정 ...하지만 내가 다시 C++ 함수 호출에서지고있어 결과에 따라 작동하지 않는 것 같습니다.

누가 잘못 될지 알 수 있습니까?

추가 :이 메서드는 int32float64의 혼합 된 dtype에서 작동하지만 어떤 이유로 문자열과 잘 어울리지 않는 것 같습니다. 그것은 Numpy 대 C에서 null 문자의 적절한 패딩과 관련이 있을까요?

+1

나는 cython을 모른다. 그래서 이것은 완전히 꺼져 있을지 모르지만, 모든'this_arr'에 대한 참조는 확실히 유지되고 있는가? –

+0

C 함수가'void *'를 캐스팅 한 데이터의 유형을 알고 있습니까? 실제로 일치해야합니다. – DavidW

+0

@PaulPanzer 나는 똑같은 것을 생각했지만, 나는 그들이 그렇다고 생각한다. 'void *'를'char *'로 콘솔에 출력하는 것은 어쨌든 보관된다는 것을 나타내는 것 같습니다. :) @DavidW C 함수는'void *'를 적절한 타입으로 캐스팅해야합니다. 이 기능의 다른면은 있지만 확실하게 진행되고있는 것이 무엇인지 알기가 어렵습니다. 특히 어려운 점 중 일부입니다. 내가 아는 바로는이 방법은 파이썬 유형'int'와'float'의 조합에 대해서는 작동하지만 어떤 이유로 든 문자열에 대해서는 작동하지 않습니다. –

답변

0

작성된대로 배열 또는 목록 등의 배열이 아닙니다. 각 요소가 포인터 인 (2,3) 배열입니다.

In [1]: arr = np.array([[1,2,3],['Six','Ten','Rodger']], dtype = 'O') 
In [2]: arr 
Out[2]: 
array([[1, 2, 3], 
     ['Six', 'Ten', 'Rodger']], dtype=object) 
In [3]: arr.shape 
Out[3]: (2, 3) 
In [4]: arr[0,:] 
Out[4]: array([1, 2, 3], dtype=object) 
.... 

이러한 포인터는 메모리의 다른 곳에서 정수 또는 문자열을 가리 킵니다. 당신이 사이 썬에서 수행하려고하는 것 같습니다

, 죄송합니다

In [16]: a2=np.zeros((2,),object) 
In [17]: a2[...] =[arr[0].astype(int), arr[1].astype(str)] 
In [18]: a2 
Out[18]: 
array([array([1, 2, 3]), 
     array(['Six', 'Ten', 'Rodger'], 
     dtype='<U6')], dtype=object) 

에 해당하는 I는 명백한 진술합니다. cython으로 속도를 높이려고 노력하고 있지만 C++ 부분을 많이 차지하려고하지는 않습니다. 그리고 나머지 Cython 코드가 없으면 그것을 실행할 수없고 스스로 잘못한 것을 볼 수 없습니다. 우리는 막연한 무엇인가가 잘못되었다는 당신의 말을 듣기 만하면됩니다.