首页 > 解决方案 > Cython `inline` 方法无法访问

问题描述

我正在尝试使用一些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方法?

标签: pythonscikit-learncython

解决方案


查看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.        ]])

pairwise()您还可以在方法中使用两个数组 X、Y 和


推荐阅读