Фильтрация многомерных представлений в xtensor

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

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

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

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

РЕДАКТИРОВАТЬ:

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

2

Решение

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);

Я открою вопрос для этого.

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]