Pybind Numpy访问2D / ND阵列

发布于 2021-01-29 17:23:17

pybind的新手-请阅读文档,但我不了解如何将其应用于2D阵列。

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

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

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

在某些文档中,我阅读了通过[]运算符访问元素的信息,而在另一些文档中,则阅读了()。如何分配3D向量?我如何获取指向数组元素的指针以使用跨度进行赋值-
还是它具有运算符?

关注者
0
被浏览
200
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    PyBind很棒,向作者/维护者大喊大叫!您这里有一个几乎可行的示例。

    适应您的问题,它会给出类似(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
    

    希望能帮助到你。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看