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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python tkinter模块中类继承的三种方式分析
Aug 08 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
Python给你的头像加上圣诞帽
Jan 04 Python
利用Python如何实现一个小说网站雏形
Nov 23 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
Python autoescape标签用法解析
Jan 17 Python
jupyter notebook实现显示行号
Apr 13 Python
Django 解决开发自定义抛出异常的问题
May 21 Python
python list的index()和find()的实现
Nov 16 Python
神经网络训练采用gpu设置的方式
Mar 03 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
图书管理程序(二)
2006/10/09 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
php字符串操作常见问题小结
2016/10/11 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
简明json介绍
2008/09/28 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
canvas知识总结
2017/01/25 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
浅谈Python基础之I/O模型
2017/05/11 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Python中print和return的作用及区别解析
2019/05/05 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
python爬取招聘要求等信息实例
2020/11/20 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
装修施工安全责任书
2014/07/24 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
在校生证明
2015/06/17 职场文书
同乡会致辞
2015/07/30 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
React自定义hook的方法
2022/06/25 Javascript