从c指针创建numpy数组会使ipython内核崩溃



受Gaël Varoqueux的一篇博客文章的启发,我正试图用这段代码从malloc’ed c指针创建一个numpy数组。

创建数组的行似乎会导致无效的内存访问,因为它会导致内核崩溃。我做错了什么?

%%cython -f
from libc.stdlib cimport malloc
import numpy as np
cimport numpy as np
cdef array_from_pointer(double* ptr, int size):
cdef np.npy_intp shape_c[1]
shape_c[0] = <np.npy_intp> size
ndarray = np.PyArray_SimpleNewFromData(1, shape_c, np.NPY_FLOAT64, ptr)
return ndarray

cdef N = 12
cdef double* ptr = <double*> malloc(sizeof(double)*N)
array_from_pointer(ptr, N)

在使用numpy的Array API之前,需要调用np.import_array():

%%cython -f
from libc.stdlib cimport malloc
import numpy as np
cimport numpy as np
np.import_array()
cdef array_from_pointer(double* ptr, int size):
cdef np.npy_intp shape_c[1]
shape_c[0] = <np.npy_intp> size
ndarray = np.PyArray_SimpleNewFromData(1, shape_c, np.NPY_FLOAT64, ptr)
return ndarray

cdef N = 12
cdef double* ptr = <double*> malloc(sizeof(double)*N)
array_from_pointer(ptr, N)

否则会导致分段错误,从而导致ipython内核崩溃。

最新更新