我正在玩xtensor,以便可以从Python使用它。但是,xtensor的吸引力之一就是也很容易为R建立绑定(bind),因此只需编写一次算法,然后为python和R编写绑定(bind)就可以了。

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

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

但是,我怀疑如果尝试进行R绑定(bind),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调用此函数?

最佳答案

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

另外,关于调用代码形式R的功能,您是对的,pyarraypytensor不是适当的类型。解决此问题的一种方法是将您的实现置于通用函数中,以接受任何类型的表达式,然后为每种语言创建接口(interface),并接受适当的类型,然后进行实现。

您可以在xtensor documentationthis blogpost中找到有关编写C++代码与其他语言的绑定(bind)的更多详细信息。

关于python - xtensor将numpy数组传递给具有xt::xtensor参数类型的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56184103/

10-12 17:52