Cython: создать объект ndarray без выделения памяти для данных

В Cython, как мне создать объект ndarray с определенными свойствами, не выделяя память для его содержимого?

Моя проблема в том, что я хочу вызвать функцию, которая требует ndarray, но мои данные находятся в чистом массиве c. Из-за некоторых ограничений я не могу переключиться на использование ndarray напрямую.

Code-segement для иллюстрации моего намерения:

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 ответ

Решение

Помимо эффективности, компилируется ли такое назначение?

np.empty не заполнять нулями. np.zeros делает это, и даже это делается "на лету".

Почему разница в производительности между numpy.zeros и numpy.zeros_like? исследует как empty, zeros а также zeros_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

Другие вопросы по тегам