在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
,内存被分配并被零填充,这将永远不会被使用。我该如何避免这种情况?
抛开效率不谈,这种赋值会编译吗?
np.empty
不是零填充。np.zeros
做到了这一点,甚至这也是"动态"完成的。
为什么numpy.zeros_like和numpy.zeros_like之间存在性能差异?探讨了empty
、zeros
和zeros_like
是如何实现的。
我只是cython
的初学者,但我必须使用:
tmp_buffer.data = <char *>my_buffer
不如换一种方式,使my_buffer
成为tmp_buffer
中分配的data
?
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建议使用CCD_ 11从现有数据缓冲区创建阵列。
关于内存视图http://docs.cython.org/src/userguide/memoryviews.html