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控制台中实现进度条功能
Nov 10 Python
pygame实现弹力球及其变速效果
Jul 03 Python
Python实现的文本对比报告生成工具示例
May 22 Python
Pycharm设置去除显示的波浪线方法
Oct 28 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
postman传递当前时间戳实例详解
Sep 14 Python
Python实现直播推流效果
Nov 26 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
python 爬虫如何正确的使用cookie
Oct 27 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
python四种出行路线规划的实现
Jun 23 Python
聊聊Python String型列表求最值的问题
Jan 18 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 is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
PHPMailer发送邮件
2016/12/28 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
Javascript原型链及instanceof原理详解
2020/05/25 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
python如何将图片转换素描画
2020/09/08 Python
Python 可视化神器Plotly详解
2020/12/26 Python
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
幼师自荐信范文
2013/10/06 职场文书
大学军训感言
2014/01/10 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
vue中 this.$set的使用详解
2021/11/17 Vue.js
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技
MySQL中一条SQL查询语句是如何执行的
2022/04/08 MySQL