Расширение numpy с помощью cython

Я пытаюсь обернуть заголовочный файл, который имеет множество таких функций

test.h

void test(int N, int* data_in, int* data_out);

чтобы я мог использовать их из numpy.

Сейчас у меня есть следующий код cython:

test.pyx

import numpy as np
cimport numpy as np

ctypedef np.int_t itype_t

cdef extern from 'VolumeForm.h':
    void _test 'test' (int, int*, int*)

def wrap_test(np.ndarray[itype_t, ndim=2] data):
    cdef np.ndarray[dtype_t, ndim=1] out
    out = np.zeros((data.shape[0],1), dtype=np.double)
    _test(
        data.shape[0],
        <itype_t*> data.data,
        <itype_t*> out.data
    )
    return out

Однако, когда я пытаюсь скомпилировать его, я получаю сообщение об ошибке:

Error converting Pyrex file to C:
(...)
Cannot assign type 'test.itype_t *' to 'int *'

Как я могу это исправить?


person D R    schedule 22.12.2009    source источник


Ответы (2)


Этот вопрос в настоящее время обсуждается в списке рассылки Cython; по-видимому, это связано с небольшой ошибкой в ​​​​одной из библиотек Cython:

http://codespeak.net/mailman/listinfo/cython-dev

На данный момент одним из возможных обходных путей является использование массивов NumPy dtype np.long, а затем запись вместо них «ctypedef np.long_t itype_t». Тогда вам просто нужно сделать код C счастливым с длинными целыми числами вместо целых чисел.

person Zak    schedule 27.12.2009

Другой обходной путь, который не требует, чтобы вы меняли вещи с ints на longs: измените сигнатуру функции в блоке cdef extern from '...'. Cython использует объявления в блоке cdef extern только для проверки типов при создании файла .c, но сгенерированный код C просто выполняет #include "VolumeForm.h", так что вам это сойдет с рук.

import numpy as np
cimport numpy as np

ctypedef np.int_t itype_t

cdef extern from 'VolumeForm.h':
    # NOTE: We changed the int* declarations to itype_t*
    void _test 'test' (int, itype_t*, itype_t*)

def wrap_test(np.ndarray[itype_t, ndim=2] data):
    cdef np.ndarray[dtype_t, ndim=1] out
    out = np.zeros((data.shape[0],1), dtype=np.double)
    _test(
        data.shape[0],
        <itype_t*> data.data,
        <itype_t*> out.data
    )
    return out

Cython не жалуется на вышеизложенное.

person lothario    schedule 19.02.2011