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的装饰器解决Bottle框架中用户验证问题
Apr 24 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
python操作excel的方法
Aug 16 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
python实现月食效果实例代码
Jun 18 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
python实现梯度下降和逻辑回归
Mar 24 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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.ini实现PHP文件上传功能
2014/11/27 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
php中final关键字用法分析
2016/12/07 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
python的pdb调试命令的命令整理及实例
2017/07/12 Python
python assert的用处示例详解
2019/04/01 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
python实现数字炸弹游戏
2020/07/17 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
查环查孕证明
2014/01/10 职场文书
班委竞选演讲稿
2014/04/28 职场文书
李敖北大演讲稿
2014/05/24 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
爱心募捐通知范文
2015/04/27 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
SQL Server 中的事务介绍
2022/05/20 SQL Server
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang