将std::vector<StructInts>从/转换为的最佳方法努比·恩达雷在赛顿?

2024-10-03 11:19:16 发布

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

我用cython来包装一个c++库。在c++端包装的数据结构是:

struct StructInts {
    int a;
    int b;
    int c;
};
typedef std::vector<StructInts> VectorTris;

我希望在cython端使用numpy.ndarray作为接口(因为数据源是numpy.ndarray),并具有如下想象的函数:

^{pr2}$

我尝试了从/到VectorTris(构造新的numpy.ndarrayVectorTris并填充它)如下所示:

cdef numpy.ndarray _from_vector_tris(VectorTris vector_tris):
    cdef int dim0 = vector_tris.size() * 3
    cdef numpy.ndarray _a_ndarray = numpy.empty(dim0, dtype=int)
    for i in range(vector_tris.size()):
        _a_ndarray[i*3]     = vector_tris[i].a
        _a_ndarray[i*3 + 1] = vector_tris[i].b
        _a_ndarray[i*3 + 2] = vector_tris[i].c
    return _a_ndarray

cdef VectorTris _to_vector_tris(numpy.ndarray data_source):
    # construct each StructInts and init .a, .b, .c with corresponding 
    # items in data_source, and then push_back into _a_vector_tris
    # the procedure seems like _from_vector_tris() but reversed
    return _a_vector_tris

它可以工作,但是对于大数据源,它太慢了

如何在这两种数据结构之间有效地转换? 谢谢!在


Tags: infromnumpy数据结构size数据源cythonint