cython:创建ndarray对象而不为数据分配内存

时间:2015-03-04 11:48:03

标签: 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 = <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)

这似乎效率低下,因为tmp_buffer内存被分配并且零填充永远不会被使用。我该如何避免这种情况?

1 个答案:

答案 0 :(得分:3)

除了效率之外,这种分配是否会编译?

np.empty不会填零。 np.zeros可以做到这一点,甚至可以即时完成这一过程。&#39;

Why the performance difference between numpy.zeros and numpy.zeros_like?探讨了如何实施emptyzeroszeros_like


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

tmp_buffer.data = <char *>my_buffer

如何以另一种方式进行,my_buffer分配data tmp_buffer

array1 = np.empty(bsize, dtype=int)
cdef int *data
data = <int *> array1.data
for i in range(bsize):
    data[i] = bsize-data[i]

http://gael-varoquaux.info/programming/cython-example-of-exposing-c-computed-arrays-in-python-without-data-copies.html 建议使用np.PyArray_SimpleNewFromData从现有数据缓冲区创建数组。

关于记忆观点 http://docs.cython.org/src/userguide/memoryviews.html