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中的并发编程实例
Jul 07 Python
python实现石头剪刀布程序
Jan 20 Python
python实现接口并发测试脚本
Jun 25 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
python3.8下载及安装步骤详解
Jan 15 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Pandas实现一列数据分隔为两列
May 18 Python
如何理解python面向对象编程
Jun 01 Python
Python下划线5种含义代码实例解析
Jul 10 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 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/01 无线电
用php和MySql来与ODBC数据连接
2006/10/09 PHP
smarty实例教程
2006/11/19 PHP
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
element中的$confirm的使用
2020/04/26 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
pandas 层次化索引的实现方法
2019/07/06 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
python爬虫请求头设置代码
2020/07/28 Python
python如何实时获取tcpdump输出
2020/09/16 Python
董事长秘书岗位职责
2013/11/29 职场文书
医院检讨书范文
2014/02/01 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
交通文明倡议书
2014/05/16 职场文书