选择特定行的 2D xtensor
Selecting specific rows of 2D xtensor
xtensor 的文档提供了 numpy 功能的映射 (link)。
该列表涵盖了许多用例,但有一项功能我无法重新创建。我有一个 2D 张量,我想 select 由在 运行 时间构建的序列标识的特定行。我的理解是这阻止了 xt::drop 和 xt::keep 的使用,因为它们是可变参数模板函数(我刚刚开始学习 c++,所以如果我遗漏了什么请纠正我)。此外,该序列是不规则的,无法由 xt::range.
复制
下面是我在 numpy 中想要的内容:
import numpy as np
row = 10
col = 3
array = np.arange(row*col).reshape([row, col])
chosen_rows = [0, 2, 3, 9] # imagine this is not known at compile time
subset_array = array[chosen_rows, :]
我找到了一个相关的post:
此处用于选择行的标准是基于矩阵本身的元素,而在我的例子中,该标准是外部的。我可以在表示行索引的矩阵中添加一行,但我希望避免这种情况。顺便说一句,上面的 post 日期和 xtensor 已经改变了,所以如果你对上面的 post 有更好的答案,我很乐意阅读。
如果我理解你的担心是多余的。在编译时必须知道 chosen_rows
的类型,但如果其内容保持动态就完全没问题。
您在 xtensor 中的示例:
#include <xtensor/xtensor.hpp>
#include <xtensor/xview.hpp>
#include <xtensor/xio.hpp>
int main()
{
size_t row = 10;
size_t col = 3;
xt::xtensor<size_t,2> array = xt::arange<size_t>(row*col).reshape({row, col});
xt::xtensor<size_t,1> chosen_rows = {0, 2, 3, 9};
auto subset_array = xt::view(array, xt::keep(chosen_rows), xt::all());
std::cout << subset_array << std::endl;
return 0;
}
xtensor 的文档提供了 numpy 功能的映射 (link)。
该列表涵盖了许多用例,但有一项功能我无法重新创建。我有一个 2D 张量,我想 select 由在 运行 时间构建的序列标识的特定行。我的理解是这阻止了 xt::drop 和 xt::keep 的使用,因为它们是可变参数模板函数(我刚刚开始学习 c++,所以如果我遗漏了什么请纠正我)。此外,该序列是不规则的,无法由 xt::range.
复制下面是我在 numpy 中想要的内容:
import numpy as np
row = 10
col = 3
array = np.arange(row*col).reshape([row, col])
chosen_rows = [0, 2, 3, 9] # imagine this is not known at compile time
subset_array = array[chosen_rows, :]
我找到了一个相关的post:
此处用于选择行的标准是基于矩阵本身的元素,而在我的例子中,该标准是外部的。我可以在表示行索引的矩阵中添加一行,但我希望避免这种情况。顺便说一句,上面的 post 日期和 xtensor 已经改变了,所以如果你对上面的 post 有更好的答案,我很乐意阅读。
如果我理解你的担心是多余的。在编译时必须知道 chosen_rows
的类型,但如果其内容保持动态就完全没问题。
您在 xtensor 中的示例:
#include <xtensor/xtensor.hpp>
#include <xtensor/xview.hpp>
#include <xtensor/xio.hpp>
int main()
{
size_t row = 10;
size_t col = 3;
xt::xtensor<size_t,2> array = xt::arange<size_t>(row*col).reshape({row, col});
xt::xtensor<size_t,1> chosen_rows = {0, 2, 3, 9};
auto subset_array = xt::view(array, xt::keep(chosen_rows), xt::all());
std::cout << subset_array << std::endl;
return 0;
}