使用一个遵循buffer protocol的对象就可以和numpy交互了.
这个buffer_protocol要有哪些东西呢? 要有如下接口:
1
2
3
4
5
6
7
8
|
struct buffer_info {
void * ptr;
ssize_t itemsize;
std::string format ;
ssize_t ndim;
std::vector<ssize_t> shape;
std::vector<ssize_t> strides;
};
|
其实就是一个指向数组的指针+各个维度的信息就可以了. 然后我们就可以用指针+偏移来访问数字中的任意位置上的数字了.
下面是一个可以跑的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#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的接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#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进行交互的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://www.cnblogs.com/JiangOil/p/11130670.html