如何在PyCXX中访问numpy数组

2024-07-08 10:56:33 发布

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

我想把numpy数组转换成c++端的double*或stl向量。实际上,我使用的是PyCXX,但我无法找到访问数据的方法。在

我现在可以像这样访问和返回数据缓冲区:

Py::Object arrayShape(const Py::Tuple& args ){
     Py::Object array= args[0];
     return array.getAttr("data");
}

但我不知道该怎么办。我的最终目标是从中获得一个gsl_向量。理想情况下,我不需要重新复制记忆。但也许这要求太多了;)


Tags: 数据方法pynumpyobjectargs数组array
1条回答
网友
1楼 · 发布于 2024-07-08 10:56:33

当我在寻找一个解决方案,而我只能找到其他人张贴相同的,长期未回答的问题,我张贴的解决方案,一旦我发现它。你的问题真是个问题。在

首先,强烈考虑使用赛顿作为你的胶水,不要再沿着这条危险的道路前进。在

另外,如果可能,使用PyArray_FromAny将为您提供底层数据的视图,否则将提供一个副本。一个非常简单的示例(如果您是诚实善良的人,则使用-std=c++11构建;如果您是Windows用户,则使用VS2013构建):

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <numpy/arrayobject.h>

Py::Object printNumpyArrayCxxFunction(const Py::Tuple& args)
{
    if(args.length() != 1)
    {
        throw Py::RuntimeError("Exactly one argument required.");
    }
    PyObject* vector_{PyArray_FromAny(*args[0], PyArray_DescrFromType(NPY_DOUBLE), 1, 1, NPY_ARRAY_CARRAY_RO, nullptr)};
    if(!vector_)
    {
        throw Py::ValueError("Failed to convert argument into a 1d numpy double (64-bit float) array.");
    }
    Py::Object vector(vector_, true);
    PyArrayObject* vector_npy{reinterpret_cast<PyArrayObject*>(vector_)};
    npy_intp vector_length{PyArray_SIZE(vector_npy)};
    double*const vector_begin{reinterpret_cast<double*>(PyArray_DATA(vector_npy))};
    double*const vector_end{vector_begin + vector_length};

    for(double* vector_iterator{vector_begin}; vector_iterator != vector_end; ++vector_iterator)
    {
        if(vector_iterator != vector_begin)
        {
            std::cout << ", ";
        }
        std::cout << *vector_iterator;
    }
    std::cout << std::endl;

    return Py::None();
}

注意true参数是“owned”对象的Py::Object构造函数的第二个参数!An example of a cpython3 extension that uses the Numpy C API in combination with PyCXX with cmake for building.链接指向特定提交,因为我正在考虑将此扩展切换回使用Cython。在

相关问题 更多 >

    热门问题