나는 내가 알고있는 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++ 함수 호출에서지고있어 결과에 따라 작동하지 않는 것 같습니다.
누가 잘못 될지 알 수 있습니까?
추가 :이 메서드는 int32
및 float64
의 혼합 된 dtype에서 작동하지만 어떤 이유로 문자열과 잘 어울리지 않는 것 같습니다. 그것은 Numpy 대 C에서 null 문자의 적절한 패딩과 관련이 있을까요?
나는 cython을 모른다. 그래서 이것은 완전히 꺼져 있을지 모르지만, 모든'this_arr'에 대한 참조는 확실히 유지되고 있는가? –
C 함수가'void *'를 캐스팅 한 데이터의 유형을 알고 있습니까? 실제로 일치해야합니다. – DavidW
@PaulPanzer 나는 똑같은 것을 생각했지만, 나는 그들이 그렇다고 생각한다. 'void *'를'char *'로 콘솔에 출력하는 것은 어쨌든 보관된다는 것을 나타내는 것 같습니다. :) @DavidW C 함수는'void *'를 적절한 타입으로 캐스팅해야합니다. 이 기능의 다른면은 있지만 확실하게 진행되고있는 것이 무엇인지 알기가 어렵습니다. 특히 어려운 점 중 일부입니다. 내가 아는 바로는이 방법은 파이썬 유형'int'와'float'의 조합에 대해서는 작동하지만 어떤 이유로 든 문자열에 대해서는 작동하지 않습니다. –