如何使用 pybind11 绑定一个函数,该函数将 numpy.array() 作为参数,例如,一个形状 (10, 10



我想写一个可以接受多维numpy数组的函数,而不仅仅是2D。

void compute(Eigen::Ref<Eigen::MatrixXd> array3d) {
// change the array in-place
// ...
}

Eigen::MatrixXd &compute() {
// create array
// ...
// and return it
}

我在这里使用特征只是为了描绘目标,我相信特征不支持 3D 或更多维度的数组。

感谢您的反馈和耐心,因为我不熟悉 Pybind11 或 Eigen。

从 pybind 信息中,可以提取维度信息。

例如,这是我在音频工具包中所做的,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调用,以创建可在模板化代码中使用的类似特征的矩阵。

基本上,pybind11 允许您创建一个 lambda,您可以在其中为您的用例创建包装器。这同样适用于返回,您可以获取特征类,创建一个用特征数据填充的 pybind 数组。

Eigen 也有你也可以使用的张量类。

最新更新