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之玩转字符串(3)
Sep 14 Python
Python中的lstrip()方法使用简介
May 19 Python
Python创建模块及模块导入的方法
May 27 Python
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
使用Python写一个小游戏
Apr 02 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
opencv python在视屏上截图功能的实现
Mar 05 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
用Python进行websocket接口测试
Oct 16 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
thinkphp中memcache的用法实例
2014/11/29 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
python版本的读写锁操作方法
2016/04/25 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
自主招生自荐信范文
2013/12/04 职场文书
销售求职信范文
2014/05/26 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
Linux中各个目录的作用与内容
2022/06/28 Servers