首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PyCXX中访问numpy数组

如何在PyCXX中访问numpy数组
EN

Stack Overflow用户
提问于 2010-10-10 03:26:58
回答 1查看 370关注 0票数 2

我想在c++端将numpy数组转换为一些双*或stl向量。我实际上使用的是PyCXX,但我不知道访问数据的方法。

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

代码语言:javascript
复制
Py::Object arrayShape(const Py::Tuple& args ){
     Py::Object array= args[0];
     return array.getAttr("data");
}

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

EN

回答 1

Stack Overflow用户

发布于 2014-11-20 00:41:04

当我在寻找一个解决方案时,我发现只有其他人发布了同样的长期未回答的问题,一旦我发现了解决方案,我就会把它发布出来。你的问题真是个问题。

首先,强烈考虑使用Cython作为粘合剂,不要在这条危险的道路上继续前进。

这样一来,如果可能的话,使用PyArray_FromAny将为您提供底层数据的视图,否则将提供一个副本。一个非常简单的例子(如果你是一个诚实的好人,用-std=c++11构建,或者如果你是一个Windows用户,用VS2013构建):

代码语言:javascript
复制
#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();
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3897547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档