Я пытаюсь отфильтровать 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 вид, где я сохранил только те линии, где первый элемент линии больше, чем порог.
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);
Я открою вопрос для этого.
Также обратите внимание, что фильтр возвращает одномерное выражение (поскольку элементы, удовлетворяющие условию, могут быть разбросаны в исходном выражении), вам необходимо изменить его форму, чтобы получить двумерное выражение.
Других решений пока нет …