gpt4 book ai didi

python - 在 C 中访问 numpy 数组数据(对于 numpy 1.7+)

转载 作者:太空宇宙 更新时间:2023-11-03 16:08:56 26 4
gpt4 key购买 nike

根据以下示例和 numpy C-API ( http://docs.scipy.org/doc/numpy/reference/c-api.html ),我尝试访问 cpp 中的 numpy 数组数据,如下所示:

#include <Python.h>
#include <frameobject.h>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION // TOGGLE OR NOT
#include "numpy/ndarraytypes.h"
#include "numpy/arrayobject.h"
...
// here I have passed "some_python_object" to the C code
// .. and "some_python_object" has member "infobuf" that is a numpy array
//
unsigned long* fInfoBuffer;
PyObject* infobuffer = PyObject_GetAttrString(some_python_object, "infobuf");
PyObject* x_array = PyArray_FROM_OT(infobuffer, NPY_UINT32);
fInfoBuffer = (unsigned long*)PyArray_DATA(x_array); // DOES NOT WORK WHEN API DEPRECATION IS TOGGLED

当 API 弃用被切换时,我在编译时得到:

error: cannot convert ‘PyObject* {aka _object*}’ to ‘PyArrayObject* {aka tagPyArrayObject*}’ for argument ‘1’ to ‘void* PyArray_DATA(PyArrayObject*)’

在 numpy 1.7+ 中执行此操作的合法方法是什么?

最佳答案

您可以尝试使用更高级别的库,该库使用正确的容器语义将 numpy 数组包装在 C++ 容器中。

尝试 xtensorxtensor-python 绑定(bind)。

还有一个 cookiecutter 可以生成一个最小的 C++ 扩展项目,其中包含用于测试的所有样板、html 文档和 setup.p...

示例:C++ 代码

#include <numeric>                        // Standard library import for std::accumulate
#include "pybind11/pybind11.h" // Pybind11 import to define Python bindings
#include "xtensor/xmath.hpp" // xtensor import for the C++ universal functions
#define FORCE_IMPORT_ARRAY // numpy C api loading
#include "xtensor-python/pyarray.hpp" // Numpy bindings

double sum_of_sines(xt::pyarray<double> &m)
{
auto sines = xt::sin(m);
// sines does not actually hold any value, which are only computed upon access
return std::accumulate(sines.begin(), sines.end(), 0.0);
}

PYBIND11_PLUGIN(xtensor_python_test)
{
xt::import_numpy();
pybind11::module m("xtensor_python_test", "Test module for xtensor python bindings");

m.def("sum_of_sines", sum_of_sines,
"Computes the sum of the sines of the values of the input array");

return m.ptr();
}

Python 代码:

import numpy as np
import xtensor_python_test as xt

a = np.arange(15).reshape(3, 5)
s = xt.sum_of_sines(v)
s

关于python - 在 C 中访问 numpy 数组数据(对于 numpy 1.7+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39483862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com