Cython中cimport scipy.spatial.ckdtree报错,如何正确声明KDTree类型?
解决Cython中ckdtree类型声明的错误
你的问题核心在于Scipy的ckdtree并没有对外提供可直接cimport的Cython接口(.pxd文件),当前的cimport和类型声明方式不适用,具体解决方法如下:
修正步骤
替换cimport为普通Python导入
把代码里的cimport scipy.spatial.ckdtree as ckdtree改成:import scipy.spatial.ckdtree as ckdtree因为ckdtree没有公开的Cython头文件,无法通过cimport获取静态类型定义。
修改变量类型声明
由于KDTree是Python对象,不能直接用ckdtree.KDTree作为Cython静态类型,把cdef ckdtree.KDTree tree改成:cdef object tree如果你想更明确类型,也可以写成:
cdef scipy.spatial.ckdtree.KDTree tree但本质上还是将其视为Python对象处理,因为没有C级别的类型暴露。
保留实例化代码
实例化部分的tree = ckdtree.KDTree(x_rest_view)可以直接保留,这是Python层面的正常调用。
错误原因解释
- 错误1:找不到
.pxd文件,是因为Scipy官方没有为ckdtree提供可供外部Cython代码引用的C接口定义文件。 - 错误2、3:无法识别
KDTree作为类型标识符,是因为cimport失败后,Cython无法获取到KDTree的类型信息,只能通过普通import来使用这个Python类。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

