gpt4 book ai didi

python - Pybind Numpy 访问 2D/ND 数组

转载 作者:行者123 更新时间:2023-11-28 20:14:26 25 4
gpt4 key购买 nike

pybind 的新手 - 阅读文档,但我不了解如何将其应用于二维数组。

我有两个数组存储 3d 坐标 shape = (10,3)

a = np.zeros(shape=(10,3))
b = np.ones(shape=(10,3)) * 3
c = a + b

现在,使用 pybind,我如何在 C++ 中对 numpy 数组执行此操作?

在一些文档中,我阅读了使用 [] 运算符访问元素的方法,而在其他文档中,我使用了 () 来访问元素。如何分配 3D 矢量?我如何获取指向数组元素的指针以使用步幅进行赋值 - 或者它是否有运算符?

最佳答案

PyBind 很棒,向作者/维护者致敬!你有一个几乎可以工作的例子 here .

适应你的问题它会给出类似的东西(在 El Dude 的评论后编辑的答案):

#include <iostream>
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>


namespace py = pybind11;


py::array_t<double> add_arrays(py::array_t<double> input1, py::array_t<double> input2) {
py::buffer_info buf1 = input1.request();
py::buffer_info buf2 = input2.request();

if (buf1.size != buf2.size) {
throw std::runtime_error("Input shapes must match");
}

/* allocate the buffer */
py::array_t<double> result = py::array_t<double>(buf1.size);

py::buffer_info buf3 = result.request();

double *ptr1 = (double *) buf1.ptr,
*ptr2 = (double *) buf2.ptr,
*ptr3 = (double *) buf3.ptr;
int X = buf1.shape[0];
int Y = buf1.shape[1];

for (size_t idx = 0; idx < X; idx++) {
for (size_t idy = 0; idy < Y; idy++) {
ptr3[idx*Y + idy] = ptr1[idx*Y+ idy] + ptr2[idx*Y+ idy];
}
}

// reshape array to match input shape
result.resize({X,Y});

return result;
}


PYBIND11_MODULE(example, m) {
m.doc() = "Add two vectors using pybind11"; // optional module docstring

m.def("add_arrays", &add_arrays, "Add two NumPy arrays");
}

我使用 python2.7 和 gcc v5.4 在 linux 上构建(我不得不使用与文档中提供的命令略有不同的命令,因为找不到 Python.h,因此我添加了指向 python 2.7 的链接)

c++ -O3 -Wall -shared -std=c++11 -fPIC -I/usr/include/python2.7 -lpython2.7 `python -m pybind11 --includes` example.cpp -o example`python-config --extension-suffix

然后你可以用 python 调用它

import numpy as np
import example # [bad] name I chose for my compiled module

a = np.zeros((10,3))
b = np.ones((10,3)) * 3
c = example.add_arrays(a, b)

print c

希望对您有所帮助。


编辑 - 我创建了一个 github repository包含一些基于 PyBind11 的完整示例,应该可以在所有平台上编译。

关于python - Pybind Numpy 访问 2D/ND 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49582252/

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