Выбор заданных c строк 2D Xtenor - PullRequest
1 голос
/ 28 апреля 2020
Документация

xtensor предоставляет карту для функциональных возможностей numpy ( link ).

Список охватывает много вариантов использования, но есть одна функция, которую я не смог воссоздать. У меня есть 2D-тензор, и я хочу выбрать определенные c строки, которые идентифицируются последовательностью, которая создается во время выполнения. Насколько я понимаю, это предотвращает использование xt :: drop и xt :: keep, поскольку это шаблонные функции variadi c (я только начал изучать 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, :]

Я нашел соответствующий пост : Фильтрация многомерных представлений в xtensor

Здесь критерий, используемый для выбора строк, основан на элементах самой матрицы, тогда как в моем случае этот критерий является внешним. Я мог бы добавить строку в матрицу, представляющую индекс строки, но я надеюсь избежать этого. Кстати, вышеприведенные даты постов и xtensor изменились с тех пор, так что если у вас есть улучшенный ответ на этот пост, я буду рад прочитать.

1 Ответ

1 голос
/ 30 апреля 2020

Если я хорошо понимаю, ваше беспокойство необоснованно. Во время компиляции тип chosen_rows должен быть известен, но это прекрасно, если его содержимое остается динамическим c.

Ваш пример в 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;
}
...