Cython как импортировать из другого пакета - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь расширить некоторые sklearn классы в модуле sklearn.neighbors.dist_metrics. Однако весь этот модуль написан на Cython, и вещи, которые я хочу сделать с моим пользовательским классом, должны реализовывать cdef dist (в отличие от def dist), очевидно.

Таким образом, в моем собственном модуле (сейчас я на самом деле использую jupyter %%cython) я хотел бы реализовать свой собственный класс в Cython, реализуя метод cdef dist по мере необходимости. Однако в этом же модуле, в модуле sklearn.neighbors.typedefs и, возможно, в других модулях, которые мне нужно импортировать, есть ряд других cdef. Когда я пытаюсь импортировать эти вещи, я получаю ошибки различного рода.

Когда я пытаюсь наивно import:

%%cython
import numpy as np
from sklearn.neighbors.dist_metrics import DistanceMetric
from sklearn.neighbors.typedefs import DTYPE_t, ITYPE_t

cdef class NewDistance(sklearn.neighbors.DistanceMetric):
    cdef inline DTYPE_t dist(self, DTYPE_t* x1, DTYPE_t* x2,
                             ITYPE_t size) nogil except -1:
        return 5

Я получаю ошибки, свидетельствующие о том, что, как только вещи были «питонизированы», я не могу использовать их в определении «cython»:

Error compiling Cython file:
...
First base of 'KernelDistance' is not an extension type
...
'DTYPE_t' is not a type identifier

Существует ключевое слово cimport, поэтому:

%%cython
import numpy as np
from sklearn.neighbors.dist_metrics cimport DistanceMetric
from sklearn.neighbors.typedefs cimport DTYPE_t, ITYPE_t

cdef class NewDistance(sklearn.neighbors.DistanceMetric):
    cdef inline DTYPE_t dist(self, DTYPE_t* x1, DTYPE_t* x2,
                             ITYPE_t size) nogil except -1:
        return 5

Annnnndddd ...

Error compiling Cython file:
....
'sklearn/neighbors/dist_metrics.pxd' not found
....
'sklearn/neighbors/typedefs.pxd' not found

Как можно импортировать файлы Cython из других библиотек?

...