Как ускорить работу np.roll()?Python

Программы на Python
Anonymous
Как ускорить работу np.roll()?

Сообщение Anonymous »

Я использую np.roll() для усреднения по методу ближайшего соседа, но чувствую, что есть более быстрые способы. Вот упрощенный пример, но представьте себе 3 измерения и более сложные «трафареты» усреднения. Для примера см. раздел 6 этой статьи.
Вот несколько строк из этого упрощенного примера:

Код: Выделить всё

for j in range(nper):
phi2 = 0.25*(np.roll(phi,  1, axis=0) +
np.roll(phi, -1, axis=0) +
np.roll(phi,  1, axis=1) +
np.roll(phi, -1, axis=1) )
phi[do_me] = phi2[do_me]
Так стоит ли мне искать что-то, что возвращает представления вместо массивов (поскольку кажется, что Roll возвращает массивы)? В этом случае выполняется ли инициализация нового массива при каждом его вызове? Я заметил, что для небольших массивов накладные расходы огромны.
На самом деле это наиболее эффективно для массивов размером от [100,100] до [300,300] на моем ноутбуке. Возможные проблемы с кэшированием выше этого.
Может ли scipy.ndimage.interpolation.shift() работать лучше, как это реализовано здесь, и если да, то исправлено ли это? В приведенном выше примере я все равно выбрасываю обернутые части, но, возможно, не всегда.
примечание: в этом вопросе я ищу только то, что доступно в NumPy/SciPy. Конечно, есть много хороших способов ускорить Python и даже NumPy, но это не то, что я ищу здесь, потому что Я действительно пытаюсь лучше понять NumPy.

Вернуться в «Python»