Методы `inline` на Cython недоступны - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь использовать некоторые sklearn модули, написанные на Cython (о которых я не говорю). В модуле определен метод cdef inline..., и кажется, что другие методы cdef в модуле используют эти методы, но я не могу получить к ним доступ.

Здесь - это место, где определен класс, и что существует метод dist:

cdef class EuclideanDistance(DistanceMetric):
    #STUFF

    cdef inline DTYPE_t dist(self, DTYPE_t* x1, DTYPE_t* x2,
                             ITYPE_t size) nogil except -1:
        return euclidean_dist(x1, x2, size)

    #MORESTUFF

И здесь мы видим, что метод dist используется в других местах:

cdef inline DTYPE_t dist(self, DTYPE_t* x1, DTYPE_t* x2,
                         ITYPE_t size) nogil except -1:
    """Compute the distance between arrays x1 and x2"""
    self.n_calls += 1
    if self.euclidean:
        return euclidean_dist(x1, x2, size)
    else:
        return self.dist_metric.dist(x1, x2, size)   ####HERE!!!!

Но когда я пытаюсь использовать этот метод, его просто не существует ....

import sklearn.neighbors
help(sklearn.neighbors.dist_metrics.EuclideanDistance)

Как получить доступ к методу dist?

1 Ответ

0 голосов
/ 30 августа 2018

Посмотрите на класс DistanceMetric . Он предназначен для использования следующим образом:

from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('euclidean')

print(dist)
# <sklearn.neighbors.dist_metrics.EuclideanDistance at 0x7fabe405e848>

А затем для доступа к методу dist используйте pairwise(), который внутренне вызовет dist()

X = [[0, 1, 2], [3, 4, 5]]

dist.pairwise(X)
# array([[0.        , 5.19615242],
#       [5.19615242, 0.        ]])

Вы также можете использовать два массива X, Y и в методе pairwise()

...