Swig C ++:接口vector <Class object *>

忍者

基本上,我试图有一个元组/列表,其中包含python中不同数据类型的值(float / int / bool / char / list)的数据字典。

我从下面的代码中得到这个:

(<f_p.Bunch; proxy of <Swig Object of type 'Bunch *' at 0x7f4954bdde10> >, <f_p.Bunch; proxy of <Swig Object of type 'Bunch *' at 0x7f4954bdde40> >, <f_p.Bunch; proxy of <Swig Object of type 'Bunch
*' at 0x7f495668be70> >, <f_p.Bunch; proxy of <Swig Object of type 'Bunch *' at 0x7f4952d09a50> >)

我想以这种形式获取输出:

({'I':1.0,'B':2.0,'C':3.0,'dert _':[1.2,2.3,3.4,4.5,5.6]})

我无法处理此类对象指针(bunch *),也找不到任何解决方案。我在网上看了一下,但找不到适合我的案件的解决方案。

f_p.cpp:

#include <iostream>
#include "f_p.h"
#define CPP_14 0

std::vector<Bunch*> form_p(const double *array, int x, int y)  {

    std::vector<Bunch*> v;
    Bunch *b1 = new Bunch(5);
    b1->set_I_B_C(1.0, 2.0, 3.0);
    b1->set_dert_({1.2, 2.3, 3.4, 4.5, 5.6});

    float *_dert = b1->get_dert_();
    for(int i=0; i<5; i++) {
        std::cout << _dert[i] << std::endl;
    }

    v.push_back(b1);
    v.push_back(b1); 
    v.push_back(b1); 
    v.push_back(b1); 

    return v;
}

f_p.h:

#ifndef F_P_H
#define f_P_H
#include <memory> 
#include <vector>
#include <memory> 
#include <algorithm>
#include <tuple>
#include <initializer_list>

class Bunch {
    private:
        unsigned int start;
        unsigned int end;
        float I;
        float B;
        float C;
        bool isPos;
        std::unique_ptr<float[]> dert_;
    public:

        explicit Bunch(size_t width) {
            #if CPP_14
            this->dert_ = std::make_unique<float[]>(width);
            #else
            this->dert_ = std::unique_ptr<float[]>(new float[width]);
            #endif
            std::fill_n(this->dert_.get(), width, -1.0);
        }

        void set_I_B_C(float I, float B, float C) {
            this->I = I;
            this->B = B;
            this->C = C;
        }

        std::tuple<float, float, float> get_I_B_C() const {
            return std::make_tuple(this->I, this->B, this->C);
        }

        float* get_dert_() const {
            return this->dert_.get();
        }

        void set_dert_(std::initializer_list<float> l) {
            int i = 0;
            for (auto e: l){
                dert_[i++] = e;
            }
        }
};
/* Define function prototype */
std::vector<Bunch*> form_p(const double *array, int x, int y)  ;
#endif

f_p.i:

%module f_p
#define SWIGPYTHON_BUILTIN

%{
  #include "numpy/arrayobject.h"
  #define SWIG_FILE_WITH_INIT  /* To import_array() below */
  #include "f_p.h"
%}
%include "std_map.i"
%import "std_deque.i" 
%import "std_vector.i" 

%template (mapiv) std::map<char,float>;
%template () std::vector<Bunch*>;
%include "numpy.i"

%init %{
import_array();
%}

%apply (double* IN_ARRAY2, int DIM1, int DIM2) {
  (const double* array, int x, int y)
}

%include "f_p.h"

build.sh:

rm *.o f_p_wrap.cpp _f_p.so f_p.py
rm -rf __pycache__

g++ -O3 -march=native -fPIC -c f_p.cpp
swig -python -c++ -o f_p_wrap.cpp f_p.i

# Next, compile the wrapper code:

g++ -O3 -march=native -w -fPIC -c $(pkg-config --cflags --libs python3) -I /home/antpc/anaconda3/lib/python3.7/site-packages/numpy/core/include f_p.cpp f_p_wrap.cpp

g++ -std=c++11 -O3 -march=native -shared f_p.o f_p_wrap.o -o _f_p.so -lm

test_sample.py:

from f_p import form_p
import numpy as np
x = np.random.randn(3, 4)
print(form_p(x))
印第安纳·克尼克

问题的实质可以归结为:您有一个类,并且想要将其转换为本地Python对象(而不是包装对象)。SWIG自动生成包装的对象,但是您必须竭尽全力将C ++类型转换为本机Python类型。


我假设对此进行了简化,Bunch以使类型图更具可读性。您应该能够Bunch轻松地对此进行调整另外,您可以在将类传递给Python之前将其转换为这个简单的结构。

struct Bunch {
    float i, b, c;
    std::vector<float> dert;
};

Bunch makeBunch();

这是的实现makeBunch

Bunch makeBunch() {
    return {1.0, 2.0, 3.0, {1.2, 2.3, 3.4, 4.5, 5.6}};
}

我省略了错误检查以使其简洁明了。

%typemap(out) Bunch {
    $result = PyDict_New();
    PyDict_SetItem($result, PyBytes_FromString("I"), PyFloat_FromDouble($1.i));
    PyDict_SetItem($result, PyBytes_FromString("B"), PyFloat_FromDouble($1.b));
    PyDict_SetItem($result, PyBytes_FromString("C"), PyFloat_FromDouble($1.c));
    PyObject *dert = PyList_New($1.dert.size());
    for (size_t i = 0; i != $1.dert.size(); ++i) {
        PyList_SetItem(dert, i, PyFloat_FromDouble($1.dert[i]));
    }
    PyDict_SetItem($result, PyBytes_FromString("dert_"), dert);
}

当我自己编译并运行它时,我得到了预期的结果(嗯,足够接近了!)。

>>> import test
>>> test.makeBunch()
{'I': 1.0, 'C': 3.0, 'B': 2.0, 'dert_': [1.2000000476837158, 2.299999952316284, 3.4000000953674316, 4.5, 5.599999904632568]}

类型映射不是严格必需的。您可以只使用包装的对象。删除类型映射,并确保std::vector<float>像这样公开

%include "std_vector.i"
%template(FloatVector) std::vector<float>;

然后,您可以Bunch通过包装的对象进行访问

>>> import test
>>> bunch = test.makeBunch()
>>> bunch
<test.Bunch; proxy of <Swig Object of type 'Bunch *' at 0x10b6daba0> >
>>> bunch.i
1.0
>>> bunch.b
2.0
>>> bunch.c
3.0
>>> bunch.dert
<test.FloatVector; proxy of <Swig Object of type 'std::vector< float,std::allocator< float > > *' at 0x10b6dadb0> >
>>> for d in bunch.dert:
...     print(d)
...
1.20000004768
2.29999995232
3.40000009537
4.5
5.59999990463

一些知名来源:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在SWIG接口后面调试Tensorflow的C ++代码

来自分类Dev

以指针作为参数的C ++函数,并通过swig接口处理

来自分类Dev

使用SWIG为perl创建C ++接口吗?

来自分类Dev

带有虚拟纯接口的 SWIG c#

来自分类Dev

How to convert (typemap) a jagged C++ vector of vectors to Python in SWIG

来自分类Dev

在C ++结构中将SWIG用于std :: vector成员

来自分类Dev

在C ++结构中将SWIG用于std :: vector成员

来自分类Dev

在OSX + clang上的准系统SWIG python C接口segfaulting,不在Linux + gcc中

来自分类Dev

Swig通过ref将Std :: vector通过ref /从C#传递到C ++

来自分类Dev

swig使用intel的__attribute __((vector))

来自分类Dev

从Swig C ++到Java UnsatisfiedLinkError

来自分类Dev

SWIG和C ++枚举类

来自分类Dev

在Swig上使用Intel的__attribute __((vector))

来自分类Dev

Access object from another class c++

来自分类Dev

为什么SWIG C#重载失败?

来自分类Dev

使用SWIG的C ++库的Matlab绑定

来自分类Dev

使用Swig从Go使用C ++类

来自分类Dev

使用Swig继承C ++中的错误

来自分类Dev

SWIG:以OO方式包装C API

来自分类Dev

SWIG:将枚举包装到 C#

来自分类Dev

带SWIG接口的for_each预处理器

来自分类Dev

在SWIG接口中忽略__attribute __((packed))总是安全的吗?

来自分类Dev

带SWIG接口的for_each预处理器

来自分类Dev

为覆盖 std::exception 的库生成 swig 接口时出错

来自分类Dev

swig:如何使QList <T>可迭代,如std :: vector

来自分类Dev

Swig将vector <std :: string>转换为原生PHP数组

来自分类Dev

从SWIG绑定迭代python中返回的vector <pair <int,int >>

来自分类Dev

SWIG,C ++和Python:C ++临时对象删除得太早

来自分类Dev

Swig的Python和C ++ 11:如何启用C ++ 11

Related 相关文章

热门标签

归档