我想编写一个可以采用多维numpy数组而不只是二维的函数。
void compute(Eigen::Ref<Eigen::MatrixXd> array3d) {
// change the array in-place
// ...
}
或
Eigen::MatrixXd &compute() {
// create array
// ...
// and return it
}
我在这里使用Eigen只是为了描述目标,我相信Eigen不支持3D或更多维的数组。
感谢您的反馈和耐心,因为我不熟悉Pybind11或Eigen。
答案 0 :(得分:0)
从pybind信息中,可以提取尺寸信息。
例如,这是我在Audio ToolKit中使用m
在您要构建的当前Python模块中执行的操作:
py::class_<MyClass>(m,"name")
.def("set_pointer", [](MyClass& instance, const py::array_t<DataType>& array)
{
gsl::index channels = 1;
gsl::index size = array.shape(0);
if(array.ndim() == 2)
{
channels = array.shape(0);
size = array.shape(1);
}
// Call using array.data() and possibly add more dimension information, this is specific to my use case
instance.set_pointer(array.data(), channels, size);
});
由此,您可以创建Eigen::Map
调用,而不是创建可以在模板代码中使用的类似于Eigen的矩阵。
基本上,pybind11允许您创建一个lambda,您可以在其中为用例创建包装器。同样的返回方法,您可以获取Eigen类,创建一个用Eigen数据填充的pybind数组。
Eigen具有您也可以使用的Tensor类。