pybind11和numpy进行交互的方法


Posted in Python onJuly 04, 2019

使用一个遵循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进行交互的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python中print的不换行即时输出的快速解决方法
Jul 20 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 Python
java判断三位数的实例讲解
Jun 10 Python
python实现简单五子棋游戏
Jun 18 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
Python的缺点和劣势分析
Nov 19 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
Pytorch对Himmelblau函数的优化详解
Feb 29 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
PyCharm 配置SSH和SFTP连接远程服务器
May 11 Python
pandas计算最大连续间隔的方法
Jul 04 #Python
python SQLAlchemy 中的Engine详解
Jul 04 #Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 #Python
pybind11在Windows下的使用教程
Jul 04 #Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 #Python
Pycharm简单使用教程(入门小结)
Jul 04 #Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 #Python
You might like
PHP 全角转半角实现代码
2010/05/16 PHP
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
移动端js图片查看器
2016/11/17 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
Python2包含中文报错的解决方法
2018/07/09 Python
Sanic框架应用部署方法详解
2018/07/18 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
python 定时器,轮询定时器的实例
2019/02/20 Python
Python读取实时数据流示例
2019/12/02 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
python interpolate插值实例
2020/07/06 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
详解Python中的Lock和Rlock
2021/01/26 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
2019个人年度目标制定攻略!
2019/07/12 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS