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

xtensor pass numpy array to function with xt::xtensor argument type

我正在研究 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 调用此函数才能使其正常工作?

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

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

您可以在 xtensor documentation or in this blogpost

中找到有关将 C++ 代码写入其他语言的更多详细信息