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中使用gRPC的方法示例
Aug 08 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
pymongo中聚合查询的使用方法
Mar 22 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
Django 多对多字段的更新和插入数据实例
Mar 31 Python
python实现程序重启和系统重启方式
Apr 16 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 Python
python3判断IP地址的方法
Mar 04 Python
python使用pygame创建精灵Sprite
Apr 06 Python
Selenium浏览器自动化如何上传文件
Apr 06 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 检查电子邮件函数(自写)
2014/01/16 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
JS 自定义带默认值的函数
2011/07/21 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
pandas带有重复索引操作方法
2018/06/08 Python
详解python的argpare和click模块小结
2019/03/31 Python
对python 调用类属性的方法详解
2019/07/02 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python将时分秒转换成秒的实例
2019/12/07 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
服装设计专业毕业生推荐信
2013/11/09 职场文书
车间班长岗位职责
2013/11/30 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
安全生产标语
2014/06/06 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python