cython:创建 ndarray 对象而不为数据分配内存
cython: create ndarray object without allocating memory for data
在 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
做到了,甚至做到了 'on the fly'。
Why the performance difference between numpy.zeros and 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
建议使用 np.PyArray_SimpleNewFromData
从现有数据缓冲区创建数组。
关于内存视图
http://docs.cython.org/src/userguide/memoryviews.html
在 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
做到了,甚至做到了 'on the fly'。
Why the performance difference between numpy.zeros and 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
建议使用 np.PyArray_SimpleNewFromData
从现有数据缓冲区创建数组。
关于内存视图 http://docs.cython.org/src/userguide/memoryviews.html