pybind11和numpy进行交互的方法

作者:酱油 时间:2021-08-18 23:24:14 

使用一个遵循buffer protocol的对象就可以和numpy交互了.

这个buffer_protocol要有哪些东西呢? 要有如下接口:


struct buffer_info {
 void *ptr;
 ssize_t itemsize;
 std::string format;
 ssize_t ndim;
 std::vector<ssize_t> shape;
 std::vector<ssize_t> strides;
};

其实就是一个指向数组的指针+各个维度的信息就可以了. 然后我们就可以用指针+偏移来访问数字中的任意位置上的数字了.

下面是一个可以跑的例子:


#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(), buf2 = input2.request();
  if (buf1.ndim != 1 || buf2.ndim != 1)
    throw std::runtime_error("Number of dimensions must be one");
  if (buf1.size != buf2.size)
    throw std::runtime_error("Input shapes must match");
  /* No pointer is passed, so NumPy will allocate the buffer */
  auto 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;
  for (size_t idx = 0; idx < buf1.shape[0]; idx++)
    ptr3[idx] = ptr1[idx] + ptr2[idx];
  return result;
}

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

array_t里的buf就是一个兼容的接口.

buf中可以得到指针和对应数字的维度信息.

为了方便我们甚至可以使用Eigen当作我们兼容numpy的接口:


#include <pybind11/pybind11.h>
#include <pybind11/eigen.h>
#include <Eigen/LU>
// N.B. this would equally work with Eigen-types that are not predefined. For example replacing
// all occurrences of "Eigen::MatrixXd" with "MatD", with the following definition:
//
// typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatD;

Eigen::MatrixXd inv(const Eigen::MatrixXd &xs)
{
 return xs.inverse();
}

double det(const Eigen::MatrixXd &xs)
{
 return xs.determinant();
}

namespace py = pybind11;

PYBIND11_MODULE(example,m)
{
 m.doc() = "pybind11 example plugin";

m.def("inv", &inv);

m.def("det", &det);
}

更多参考:

https://pybind11.readthedocs.io/en/stable/advanced/pycpp/numpy.html

https://github.com/tdegeus/pybind11_examples

总结

以上所述是小编给大家介绍的pybind11和numpy进行交互的方法,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://www.cnblogs.com/JiangOil/p/11130670.html

标签:pybind11,numpy
0
投稿

猜你喜欢

  • JS脚本加载后执行相应回调函数的操作方法

    2024-04-17 10:23:07
  • Python使用ffmpy将amr格式的音频转化为mp3格式的例子

    2021-06-14 13:50:07
  • Tensorflow2.1 MNIST图像分类实现思路分析

    2023-04-17 03:35:32
  • Vue.js中轻松解决v-for执行出错的三个方案

    2024-05-10 14:19:08
  • asp使用ServerVariables集合

    2008-02-27 13:22:00
  • 基于Python实现签到脚本过程解析

    2023-01-13 03:14:56
  • python和shell获取文本内容的方法

    2023-06-20 05:42:35
  • 如何利用pandas将Excel转为html格式

    2023-12-14 19:04:49
  • jquery的父、子、兄弟节点查找,节点的子节点循环方法

    2023-07-02 05:34:40
  • 浅谈Django2.0 加xadmin踩的坑

    2022-03-03 11:00:24
  • Python爬豆瓣电影实例

    2022-03-22 20:03:12
  • MYSQL删除重复数据的简单方法

    2024-01-20 17:00:21
  • 利用OpenCV和Python实现查找图片差异

    2023-01-06 07:22:22
  • python实现自动化脚本编写

    2023-11-13 14:58:14
  • 优雅地扩大链接响应区域

    2010-09-25 13:04:00
  • 详解JS如何判断对象上是否存在某个属性

    2024-04-16 09:49:28
  • Python过滤序列元素的方法

    2023-07-05 17:53:37
  • python3 sorted 如何实现自定义排序标准

    2022-09-19 21:32:49
  • antd-日历组件,前后禁止选择,只能选中间一部分的实例

    2024-04-27 15:56:35
  • js实现股票实时刷新数据案例

    2024-04-10 10:52:20
  • asp之家 网络编程 m.aspxhome.com