gpt4 book ai didi

c++ - Cython PXD 似乎没有用于 PYX 文件

转载 作者:太空狗 更新时间:2023-10-29 22:59:46 27 4
gpt4 key购买 nike

我正在尝试通过实现从 C++ 到 Python 的线性插值器来学习 cython。我正在尝试将 PXD 头文件用于最终的 Intepolator 对象,以便它可以在其他方法/类中重复使用,因此我希望 PXD 头文件可用。

我有一个工作正常的 cpp_linear_interpolation.cpp 和 cpp_linear_interpolation.h,插值器使用两个 double vector (x 和 y)作为输入进行实例化。

这是我的文件

cy_linear_interpolation.pxd

# distutils: language = c++

import cython
import numpy as np
cimport numpy as np
from libcpp.vector cimport vector

cdef extern from "cpp_linear_interpolation.h":
cdef cppclass cppLinearInterpolation:
cppLinearInterpolation(vector[double], vector[double]) except +
vector[double] interp(vector[double]) except +

vector[double] m_x
vector[double] m_y
int m_len
double m_x_min
double m_x_max

py_linear_interpolation.pxd

from cy_linear_interpolation cimport cppLinearInterpolation

cdef class LinearInterpolation:
cdef cppLinearInterpolation * thisptr

py_linear_interpolation.pyx

import cython
import numpy as np
cimport numpy as np
from libcpp.vector cimport vector
from cy_linear_interpolation cimport cppLinearInterpolation


cdef class LinearInterpolation:
# cdef cppLinearInterpolation *thisptr

def __cinit__(self,vector[double] x,vector[double] y):
self.thisptr = new cppLinearInterpolation(x, y)

def __dealloc__(self):
del self.thisptr

def interpolate(self,vector[double] x_new):
return self.thisptr.interp(x_new)

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy


setup( name = 'Cython_LinInt',
ext_modules=[Extension("cython_linear_interpolation",
sources=["py_linear_interpolation.pyx", "cpp_linear_interpolation.cpp",],
language="c++",
include_dirs=[numpy.get_include()])
],
cmdclass = {'build_ext': build_ext},
)

使用适用于 x64 的 Microsoft (R) C/C++ 优化编译器版本 15.00.30729.01 进行编译

我收到错误信息

Cannot convert 'cppLinearInterpolation *' to Python object

如果我移动

cdef cppLinearInterpolation * _thisptr

到 pyx 文件(py_linear_interpolation.pyx 中注释掉的行),它编译并运行,但是我无法从另一个 cython 文件访问指针。理想情况下,我将能够从 python 实例化插值器,并将其用作其他 python/cython 函数的参数。我确定我一定是在做一些愚蠢的事情,但是我已经在这个问题上受阻了一段时间,还没有找到解决方案......

编辑:py_linear_interpolation.pyx 中有错字,现已更正编辑 2:在 py_linear_interpolation.pyd 中有相同的类型,成员名称是 thisptr,代码仍然没有编译,我得到了同样的错误。 cython 编译器似乎没有认识到 self.thisptr 不是 python 对象,应该是指向 cppLinearInterpolation 的指针

最佳答案

改变这个:

self.thisptr = new cppLinearInterpolation(x, y)

收件人:

self._thisptr = new cppLinearInterpolation(x, y)

关于c++ - Cython PXD 似乎没有用于 PYX 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35997668/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com