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列表计数及插入实例
Dec 17 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
六个窍门助你提高Python运行效率
Jun 09 Python
Golang与python线程详解及简单实例
Apr 27 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
python实现随机漫步方法和原理
Jun 10 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
python3中sys.argv的实例用法
Apr 24 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 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
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
php类中private属性继承问题分析
2012/11/01 PHP
php批量上传的实现代码
2013/06/09 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
一个收集图片的bookmarlet(js 刷新页面中的图片)
2010/05/27 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python内置数据类型详解
2014/08/18 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
python 图像平移和旋转的实例
2019/01/10 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
合作意向协议书
2015/01/29 职场文书
公司搬迁通知
2015/04/20 职场文书
消防演习通知
2015/04/25 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书