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根据文件大小打log日志
Oct 09 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
python使用socket进行简单网络连接的方法
Apr 29 Python
python使用udp实现聊天器功能
Dec 10 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
python爬虫筛选工作实例讲解
Nov 23 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 Python
Python爬取某平台短视频的方法
Feb 08 Python
django上传文件的三种方式
Apr 29 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字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php如何连接sql server
2015/10/16 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
vue 中几种传值方法(3种)
2019/11/12 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
python列表操作使用示例分享
2014/02/21 Python
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
Django权限控制的使用
2021/01/07 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
如何选择使用结构还是类
2014/05/30 面试题
保护野生动物倡议书
2014/05/16 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
撤诉书怎么写
2015/05/19 职场文书
世界文化遗产导游词
2019/08/07 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server