1

我正在玩 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.ndarrays np.asmatrix(x, dtype=np.float32),但这也不起作用。

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

4

1 回答 1

1

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

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

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

于 2019-06-11T12:41:33.903 回答