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机器学习理论与实战(四)逻辑回归
Jan 19 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
python判断自身是否正在运行的方法
Aug 08 Python
Python 异步协程函数原理及实例详解
Nov 13 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 Python
Django操作cookie的实现
May 26 Python
Python OpenCV形态学运算示例详解
Apr 07 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 中文处理函数集合
2008/08/27 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python读取LMDB中图像的方法
2018/07/02 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
华润集团网上药店:健一网
2016/09/19 全球购物
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
个人政风行风自查自纠报告
2014/10/21 职场文书
信访维稳工作汇报
2014/10/27 职场文书
民主评议党员个人总结
2015/02/13 职场文书
详解python的内存分配机制
2021/05/10 Python
python中的sys模块和os模块
2022/03/20 Python