Numpy cython:在不为数据分配内存的情况下创建ndarray对象

Numpy cython:在不为数据分配内存的情况下创建ndarray对象,numpy,cython,Numpy,Cython,在cython中,如何创建具有已定义属性的ndarray对象,而不为其内容分配内存 我的问题是,我想调用一个需要ndarray的函数,但我的数据是在一个纯c数组中。由于一些限制,我不能直接切换到使用ndarray 代码段以说明我的意图: cdef: ndarray[npy_uint64] tmp_buffer uint64_t * my_buffer tmp_buffer = np.empty(my_buffer_size, dtype='uint64') my_buffer

在cython中,如何创建具有已定义属性的ndarray对象,而不为其内容分配内存

我的问题是,我想调用一个需要ndarray的函数,但我的数据是在一个纯c数组中。由于一些限制,我不能直接切换到使用ndarray

代码段以说明我的意图:

cdef:
    ndarray[npy_uint64] tmp_buffer
    uint64_t * my_buffer

tmp_buffer = np.empty(my_buffer_size, dtype='uint64')

my_buffer = <uint64_t *> malloc(my_buffer_size * sizeof(uint64_t))
(... do something with my_buffer that cannot be done with a ndarray ...)

tmp_buffer.data = my_buffer
some_func(tmp_buffer)
cdef:
ndarray[npy_uint64]tmp_缓冲区
uint64\u t*我的\u缓冲区
tmp_buffer=np.empty(我的缓冲区大小,dtype='uint64')
my_buffer=malloc(my_buffer_size*sizeof(uint64_t))
(…使用我的_缓冲区做一些用ndarray无法完成的事情…)
tmp_buffer.data=my_buffer
一些函数(tmp\U缓冲区)

这似乎效率低下,因为为
tmp\u缓冲区
分配了内存,并填充了永远不会使用的零。如何避免这种情况?

撇开效率不谈,这种任务是否可以编译

np.empty
不为零填充<代码>np.zeros
可以做到这一点,即使是“即时”也可以做到

探索如何实现
类零


我只是一个使用cython的初学者,但我必须使用:

tmp_buffer.data = <char *>my_buffer

建议使用
np.PyArray\u SimpleNewFromData
从现有数据缓冲区创建数组

关于记忆观

这比效率低下更糟糕,是内存泄漏。Numpy将尝试通过调用
free(tmp\u buffer.data)
释放它分配的内存,但这当然会释放我的\u缓冲区。您可以创建Cython内存视图,并将其作为Numpy数组返回,执行
return np.asarray(mymemoryview)
我遇到了内存释放问题。如果我包含一个
free(我的缓冲区)
语句,我会收到一条“double free”错误消息。
array1 = np.empty(bsize, dtype=int)
cdef int *data
data = <int *> array1.data
for i in range(bsize):
    data[i] = bsize-data[i]