Могу ли я использовать pybind1
для передачи трехмерного массива numpy в функцию c ++, принимающую Eigen::Tensor
в качестве аргумента. Например, рассмотрим следующую функцию c ++:
Eigen::Tensor<double, 3> addition_tensor(Eigen::Tensor<double, 3> a,
Eigen::Tensor<double, 3> b) {
return a + b;
}
после компиляции функции, импорта ее в python и передачи ей массива numpy np.ones((1, 2, 2))
я получаю следующее сообщение об ошибке:
TypeError: addition_tensor(): incompatible function arguments. The following argument types are supported:
1. (arg0: Eigen::Tensor<double, 3, 0, long>, arg1: Eigen::Tensor<double, 3, 0, long>) -> Eigen::Tensor<double, 3, 0, long>
Я особенно удивлен тем, что не могу передать трехмерный массив NumPy, поскольку я могу передать двумерный numpy array
функции, принимающей Eigen::MatrixXd
, как:
Eigen::MatrixXd addition(Eigen::MatrixXd a, Eigen::MatrixXd b) { return a + b; }
Весь код, который я использовал для этого примера:
#include <eigen-git-mirror/Eigen/Dense>
#include <eigen-git-mirror/unsupported/Eigen/CXX11/Tensor>
#include "pybind11/include/pybind11/eigen.h"
#include "pybind11/include/pybind11/pybind11.h"
Eigen::MatrixXd addition(Eigen::MatrixXd a, Eigen::MatrixXd b) { return a + b; }
Eigen::Tensor<double, 3> addition_tensor(Eigen::Tensor<double, 3> a,
Eigen::Tensor<double, 3> b) {
return a + b;
}
PYBIND11_MODULE(example, m) {
m.def("addition", &addition, "A function which adds two numbers");
m.def("addition_tensor", &addition_tensor,
"A function which adds two numbers");
}
Я скомпилировал приведенный выше код с помощью g++ -shared -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`
. У кого-нибудь есть идея, как я могу использовать трехмерный массив numpy
для функции, принимающей трехмерный Eigen::Tensor
?