Фильтрация многомерных представлений в xtensor - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь отфильтровать двухмерный вид xtensor с простым условием. Я нашел функцию xt :: filter, но когда я ее использую, она возвращает только первый столбец отфильтрованного представления. Мне нужен 2D фильтрованный вид. Каков наилучший способ сделать это?

Я мог бы проверять условие построчно и сам получать все индексы, и использовать xt :: view для отображения только необходимых строк, но я надеюсь, что более сложный метод использует набор инструментов xtensor.

Мой текущий фильтр, который возвращает только одно направление, выглядит следующим образом:

auto unfiltered = xt::view(...);
auto filtered = xt::filter(unfiltered,  xt::view(unfiltered, xt::all(), 0) > tresh);

EDIT:

Возможно, мне не совсем ясно. Мне нужен двухмерный вид, где я сохранил только те линии, где первый элемент линии больше порога.

1 Ответ

0 голосов
/ 12 июля 2018

xt::view(unfiltered, xt::all(), 0)

создает представление, которое содержит только первый столбец неотфильтрованного.Следующее должно делать то, что вы ожидаете:

auto unfiltered = xt::view(...);
auto filtered = xt::filter(unfiltered, unfiltered > tresh);

РЕДАКТИРОВАТЬ: извините за недоразумение, вот обновление после замечания OP:

Условие не передается в форме выражения дляфильтр, обходной путь на данный момент:

auto unfiltered = xt::view(...);
auto filtered = xt::filter(unfiltered,
                           xt::broadcast(xt::view(unfiltered, xt::all(), 0, xt::newaxis()),
                                         unfiltered.shape()) > tresh);

Я открою для этого проблему.

Также обратите внимание, что фильтр возвращает одномерное выражение (потому что элементы, удовлетворяющие условию, могут быть разбросаныв исходном выражении), вам нужно изменить его форму, чтобы получить 2D-выражение.

...