2015-07-19 60 views
1

我有一个C++类,其中一个变量是一个动态数组。这是非常简单的,目前仅用于测试目的:如何使用Python访问属于对象的动态C++数组变量?

class testClass { 

public: 
    int *x; 

    testClass(); 
    ~testClass(); 
}; 

变量x被初始化一些值,目前通过构造。我试图通过Cython来编写C++类的python包装代码,它可以访问x。我怎样才能做到这一点?

最好的事情是能够在不复制大量数据的情况下访问变量,因为x可能很大。我可以作为数组访问吗?

例如,它的行为如numpy数组,可能只能读取?我希望能够在使用python的其他计算中使用x中的数据,所以numpy数组是首选。

我想我可以做一个GET方法初始化numpy的阵列,通过它,它给GET方法,并与来自x与循环中的数据填充它,但这将复制的数据,似乎并不十分优雅。希望有更好的解决方案。

我试着用一个静态数组,并找到了一种解决方案。如果x是静态的,我可以做一个.pyx文件中的以下内容:

cdef extern from "testClass.h": 
    cdef cppclass testClass: 
     testClass() 
     int x[5] 

cdef class pyTestClass: 
    cdef testClass *thisptr 

    def __cinit__(self): 
     self.thisptr = new testClass() 
    def __dealloc__(self): 
     del self.thisptr 

    property x: 
     def __get__(self): 
      return self.thisptr.x 

如果我在Python访问x,我会得到与值回Python列表。


如何使用Python访问属于对象的动态C++数组变量?

+0

你的课似乎很奇怪,因为你没有存储长度/形状值。你怎么知道数组中有多少个值? – BeRecursive

回答

0

看看this example,它解释了如何将C中分配的数组暴露给没有数据副本的numpy。有关行创建,例如,一维整数数组numpy的在用Cython与已经分配的数据,

ndarray = np.PyArray_SimpleNewFromData(1, shape, np.NPY_INT, data_pointer) 

请参见相应的Numpy documentation