Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Cython中包装返回复杂类型向量的函数_Python_C++_Vector_Cython_Complex Numbers - Fatal编程技术网

Python 在Cython中包装返回复杂类型向量的函数

Python 在Cython中包装返回复杂类型向量的函数,python,c++,vector,cython,complex-numbers,Python,C++,Vector,Cython,Complex Numbers,我目前正在尝试包装我创建的C++类。其中一个函数返回包含复杂浮点的向量向量: std::vector 我的DataBridge.pxd文件如下所示: # distutils: language = c++ from libcpp cimport bool from libcpp cimport float from libcpp.vector cimport vector from libcpp.complex cimport complex from libc.float cimport

我目前正在尝试包装我创建的C++类。其中一个函数返回包含复杂浮点的向量向量:

std::vector

我的DataBridge.pxd文件如下所示:

# distutils: language = c++

from libcpp cimport bool
from libcpp cimport float
from libcpp.vector cimport vector
from libcpp.complex cimport complex

from libc.float cimport float

cimport numpy as np
import numpy as np

cdef extern from "projectxcpp/bridge.cpp":
    pass

# Declare the class with cdef
cdef extern from "projectxcpp/bridge.hpp":
    cdef cppclass DataBridge:
        DataBridge() except +
        void start()
        void stop()
        bool isDataReady()
        vector[vector[complex[float]]] getData()
#ifndef BRIDGE_HPP
#define BRIDGE_HPP

#include <vector>
#include <complex>

...

class DataBridge {
    public:
        int start(void);
        int stop(void);

        bool isDataReady(void);
        std::vector<std::vector<std::complex<float>>> getData(void);

    private:
        ...
};

#endif
My bridge.hpp文件如下所示:

# distutils: language = c++

from libcpp cimport bool
from libcpp cimport float
from libcpp.vector cimport vector
from libcpp.complex cimport complex

from libc.float cimport float

cimport numpy as np
import numpy as np

cdef extern from "projectxcpp/bridge.cpp":
    pass

# Declare the class with cdef
cdef extern from "projectxcpp/bridge.hpp":
    cdef cppclass DataBridge:
        DataBridge() except +
        void start()
        void stop()
        bool isDataReady()
        vector[vector[complex[float]]] getData()
#ifndef BRIDGE_HPP
#define BRIDGE_HPP

#include <vector>
#include <complex>

...

class DataBridge {
    public:
        int start(void);
        int stop(void);

        bool isDataReady(void);
        std::vector<std::vector<std::complex<float>>> getData(void);

    private:
        ...
};

#endif
当在我的包装中声明类型为
complex[float]e
vector[vector[float]]e
时,这些类型将解析并移动到编译的下一步

只是想知道对于Cython来说,在向量中放置一个复杂类型是否有特殊的要求,似乎无法找到这种情况或类似的情况,其中包含C++包。


我的最终目标是能够将这些数据读入numpy数组。如果有更好的方法,请让我也知道-谢谢

> P>我认为问题是复杂< /Cord>已经是Python/Cython中的一个类型(并且在一些地方也有轻微的处理,因为与C或C++复杂的重叠…)如果您重命名它,或者通过它的完整路径对它进行寻址,它就会工作

from libcpp.complex cimport complex as cpp_complex

# later
vector[vector[cpp_complex[float]]]


对于问题的更一般部分:我的偏好是不要为这样的Numpy数组提供数据。部分原因是我真的不喜欢2D数组被定义为指向指针的指针或向量的向量。最好使用与形状信息一起存储的一维数组/向量,以便对其进行索引

有几个与Numpy接口的选项:

>P>如果你事先知道大小,然后用NUMPY分配内存,并把那个内存传递到C++(你可以得到一个指针到一个麻木数组的第一个元素)。这种方式,C++代码修改了NUMPY的内存,而不必复制数据。

>P>如果您想用C++分配内存,那么可以用Cython类包装它。内存由C++管理,但Numpy可以直接访问内存而不复制。(您可能需要实现移动构造函数以避免复制,但这相当简单)

  • 您可以使用Numpy C API函数
    PyArray\u SimpleNewFromData
    让Numpy包装内存。这需要小心确保在正确的时间释放它

  • 您可以执行当前正在执行的操作,并复制数据。这是非常简单的实现,但是每次您想从C++到Python移动数据时都会添加一个拷贝操作。
    cimport libcpp.complex
    
    # later
    vector[vector[libcpp.complex.complex[float]]]