根据列值在 2D 伸张量表中查找单元格

问题描述

我想根据表格中一列中的匹配单元格读取 2D xtensor 表格的一个单元格。

考虑一个包含 std::string 类型元素的二维表:

+-----+---+---+---+
| fee | I | J | K |
+-----+---+---+---+
| fie | L | M | N |
+-----+---+---+---+
| fo  | O | P | Q |
+-----+---+---+---+
| fum | R | S | T |
+-----+---+---+---+

我想读取第一列 == 'fo',即 'P' 的行中第三个单元格的值

互联网上的搜索建议使用函数 xt::keep() 的代码,该函数似乎未实现。我如何使用 实际实现的 xt 函数来执行此操作?

解决方法

您可以检查数组中的哪个位置有等于“fo”的元素。在这种情况下,结果将是索引 {2,0}。然后您可以使用该索引的第一个元素 (2) 和所需的列索引 (2) 并在所需位置获得数组的视图。

像这样:

#include <xtensor/xtensor.hpp>
#include <xtensor/xio.hpp>
#include "xtensor/xview.hpp"

int main()
{
    xt::xarray<std::string> arr{{"fee","i","j","k"},{"fie","l","m","n"},{"fo","o","p","q"},{"fum","r","s","t"}};

    auto indices = xt::where(xt::equal(arr,std::string("fo"))) // indices = {{2},{0}}
    auto result = xt::view(arr,xt::keep(indices[0]),xt::keep(2)) // result = {"p"}
    std::cout << result << std::endl;
    return 0;
}
,

除了@TaiguaraTupinambás 的答案之外,我还建议您在想要从数组(或二维中的“矩阵”或“表”)中获取特定元素时,根本不要使用 xt::view案件)。对于您的示例,我会这样做:

#include <xtensor/xtensor.hpp>
#include <xtensor/xio.hpp>

int main()
{
    xt::xtensor<std::string,2> arr =
        {{"fee","I","J","K"},"L","M","N"},"O","P","Q"},"R","S","T"}};

    auto indices = xt::from_indices(xt::argwhere(xt::equal(arr,std::string("fo"))));
    auto row = indices(0,0);
    std::cout << arr(row,2) << std::endl;
    return 0;
}

请注意,row 只是一个索引(size_t 类型)。现在 arr(row,2) 是对您要查找的元素的引用(std::string& 类型)。在这种情况下,我认为这比使用 xt::view 更干净,而且结果也会更快。