xtensor 将 numpy 数组传递给具有 xt::xtensor 参数类型的函数

Posted

技术标签:

【中文标题】xtensor 将 numpy 数组传递给具有 xt::xtensor 参数类型的函数【英文标题】:xtensor pass numpy array to function with xt::xtensor argument type 【发布时间】:2019-05-17 10:02:30 【问题描述】:

我正在使用 xtensor,以便可以在 Python 中使用它。然而,xtensor 的一大吸引力在于它也很容易为 R 进行绑定,因此只需编写一次算法,然后为 python 编写绑定和为 R 编写绑定,就大功告成了。

我从 python 开始,当我将参数类型设置为 xt::pyarray 时,我的代码可以正常运行。

void func(const xt::pyarray<float> x)  ... 
...
m.def("func", &func);

但是,如果我尝试进行 R 绑定,我怀疑 xt::pyarray 将不合适。此外, xt::pyarray 可能是 xt::xarray 类型。我记得在某处读到 xt::xtensor 可以更好地优化,因为事先知道维数。所以 xt::xtensor 是要走的路。

void func(const xt::xtensor<float, 2> x)  ... 
...
m.def("func", &func);

所以我做了这个改变,太棒了 - 它仍然有效。但是现在,我不知道如何从 numpy 调用它。如果我按照以前的方式调用它,使用 np.ndarrays,这将不再有效并通知我类型不匹配。我也试过用np.asmatrix(x, dtype=np.float32) 转换np.ndarrays,但这也不起作用。

我应该如何从 numpy 调用这个函数才能使它工作?

【问题讨论】:

通常你应该能够使用 NumPy 数组调用这样的函数。你确定你用 2 级数组调用它(我猜这是 np.asmatrix 确保的,但我不熟悉它)?你能发布一个最小的可重现的例子吗? 【参考方案1】:

xtensor-python 等效于 xtensorpytensor 就像 pyarrayxtensor-pyrhon 等效于 xarray。请注意xtensorpytensor 是不同的类型,即使它们接受相同类型的模板参数。 pytensor 可以分配一个 numpy 数组,而 xtensor 不能(同样代表 xarraypyarray)。

另外,关于从 R 调用代码的能力,你是对的,pyarraypytensor 不是合适的类型。解决此问题的一种方法是将您的实现放在接受任何类型表达式的泛型函数中,然后为每种语言制作接口,接受适当的类型并转发给实现。

您可以在xtensor documentation 或this blogpost 中找到有关将 C++ 代码绑定到其他语言的更多详细信息

【讨论】:

以上是关于xtensor 将 numpy 数组传递给具有 xt::xtensor 参数类型的函数的主要内容,如果未能解决你的问题,请参考以下文章

当我将numpy数组作为输入传递给keras层时,它具有不同的形状

将 numpy 数组传递给 c++ 函数并返回 numpy 数组作为输出的最有效方法是啥?

通过 SWIG 将简单的 numpy 数组传递给 C

将 numpy 数组传递给 C++

如何通过 cython 将 numpy 数组列表传递给 c++

使用 SWIG 将 numpy 数组元素(int)传递给 c++ int