如何实现Cython(C++到python)的向量< vector < Obj>?

2024-03-28 16:53:00 发布

您现在位置:Python中文网/ 问答频道 /正文

请参见此处的代码:https://github.com/rootpy/root_numpy/blob/master/root_numpy/src/tree.pyx#L228

cdef cppclass VectorConverter[T](VectorConverterBase):
    int elesize
    int nptypecode
    Vector2Array[T] v2a
    __init__():
        cdef TypeName[T] ast = TypeName[T]()
        info = TYPES[ast.name]
        this.elesize = info[1].itemsize
        this.nptypecode = info[2]
    int write(Column* col, void* buffer):
        cdef vector[T]* tmp = <vector[T]*> col.GetValuePointer()
        cdef unsigned long numele = tmp.size()
        # check cython auto generate code
        # if it really does &((*tmp)[0])
        cdef T* fa = this.v2a.convert(tmp)
        return create_numpyarray(buffer, fa, this.nptypecode, numele, this.elesize)

基本上-这段代码的意思是将vector <object>(通常是float或int)转换成数组[尤其是NumPy数组]。我很难理解,但我离题了。在

我需要潜在地扩展它,以便有一些东西可以实现vector<vector <object>>。我认为它应该是,几乎,我在上述链接中强调的代码的副本。在

我从哪里开始?在


Tags: 代码infonumpycolrootthisasttmp
1条回答
网友
1楼 · 发布于 2024-03-28 16:53:00

我已经解决了这个问题,既然我不是DenverCoder9,下面是我如何做到的,如果它在将来对某人有帮助,即使是过时的

cdef cppclass VectorVectorConverter[T](VectorConverterBase):
    int elesize
    int nptypecode
    Vector2Array[T] v2a
    __init__():
        cdef TypeName[T] ast = TypeName[T]()
        info = TYPES[ast.name]
        this.elesize = info[1].itemsize
        this.nptypecode = info[2]
    int write(Column* col, void* buffer):
        cdef vector[vector[T]]* tmp = <vector[vector[T]]*> col.GetValuePointer()
        #this will hold number of subvectors
        cdef unsigned long numele

        cdef T* fa

        #these are defined solely for the outer array wrapper
        cdef int objsize = np.dtype('O').itemsize
        cdef int objtypecode = np.NPY_OBJECT
        # it seems *tmp is exposed via tmp[0]
        # we want to create an outer array container that dataptr points to, containing pointers
        #    from create_numpyarray()
        numele = tmp[0].size()

        #define an (numele)-dimensional outer array to hold our subvectors fa
        cdef np.npy_intp dims[1]
        dims[0] = numele
        cdef np.ndarray outer = np.PyArray_EMPTY(1, dims, objtypecode, 0)
        cdef PyObject* outerobj = <PyObject*> outer # borrow ref
        # increase one since we are putting in buffer directly
        Py_INCREF(outer)
        # now write PyObject* to buffer
        memcpy(buffer, &outerobj, sizeof(PyObject*))

        # build a dataptr pointing to outer, so we can shift and write each of the subvectors
        cdef char* dataptr = <char*> outer.data

        # loop through all subvectors
        for i in xrange(numele):
          fa = this.v2a.convert(&tmp[0][i])
          # for some reason, shift isn't working, so we're directly shifting it ourselves
          #dataptr = shift(&dataptr, objsize)
          create_numpyarray(&dataptr[i*objsize], fa, this.nptypecode, tmp[0][i].size(), this.elesize)
        return sizeof(outerobj)

相关问题 更多 >