Pull to refresh

Comments 5

А зачем в функцию roll передавать окно в виде numpy-массива, если нужна только форма окна, то есть просто shape?


Универсальная функция roll бы имела какую-то такую сигнатуру:


def roll(a: np.ndarray, w: Tuple[int, ...], step: Union[int, Tuple[int, ...]] = 1) -> np.ndarray:
    ...

А так stride_tricks — это чёрная магия numpy, обожаю их.

Да, верно, можно передавать только форму сканирующего окна. В дальнейшем, для обобщения, потребовалось передать еще размерность сканирующего окна. Однако решил передать окно целиком для наглядности, то есть передаются массивы a и b, а уже внутри у массива b берется форма и размерность. Насколько я знаю, реализация Python сделана так, что переменные передаются по ссылке (язык программирования C/C++, передача переменных в функцию по значению и по ссылке). Поэтому такой хак, на мой взгляд, не критичен, но приводит к большей наглядности кода (передается меньше переменных в функцию).

Спасибо за статью.
Сейчас прохожу один курс, в котором одно из заданий применить свёртку с ядром к сигналу, т.е. как раз пройтись по входному массиву скользящим окном. При малых значениях входного массива разницы между двумя способами особой нет, но на длине в миллион способ без явных циклов отработал в 90 раз быстрее. На 100 миллионах он отработал за полторы секунды, а способ с циклами «повис».

Писать циклы в питоне по длинным последовательностям с тяжёлыми вычислениями на каждой итерации — дело абсолютно бесперспективное.


На счет свёртки, в numpy она есть из коробки (функция convolve). Лучше с ней сравнивать.
А так же всё или почти всё что душе угодно есть в scipy.signal.

Sign up to leave a comment.

Articles