Один трюк будет использовать Scipy's 1D minimum filter
и сравнить текущий элемент с минимальным интервалом, начиная с первого после текущего и длиной n
. Проверяя минимум на этом интервале, мы в основном проверяем для greater-than
все элементы.
Таким образом, мы получили бы решение, как так -
from scipy.ndimage.filters import minimum_filter1d as minf
def rolling_comparison(a, W):
HW = (W-1)//2 # Half window size for offsetting kernel in min filter
v = minf(a,W,origin=-HW)
return v[:,1:] > a[:,:-1]
Вот тестовый образец с различными размерами окна -
In [245]: a
Out[245]:
array([[59, 86, 77, 31, 91, 88, 13, 77, 77, 39],
[12, 63, 98, 21, 69, 89, 93, 38, 52, 62],
[29, 58, 42, 74, 22, 27, 23, 40, 37, 11]])
In [246]: rolling_comparison(a, W=3)
Out[246]:
array([[False, False, False, False, False, False, True, False, False],
[ True, False, False, True, False, False, False, True, False],
[ True, False, False, False, True, False, False, False, False]])
In [247]: rolling_comparison(a, W=5)
Out[247]:
array([[False, False, False, False, False, False, True, False, False],
[ True, False, False, True, False, False, False, False, False],
[False, False, False, False, False, False, False, False, False]])
In [248]: rolling_comparison(a, W=7)
Out[248]:
array([[False, False, False, False, False, False, False, False, False],
[ True, False, False, True, False, False, False, False, False],
[False, False, False, False, False, False, False, False, False]])
Решая пример случай
Теперь, перечисленный подход работает вдоль каждой строки двумерного массива. Кажется, вы хотите, чтобы он работал на основе столбцов. Кроме того, перечисленный подход reflects
граничные элементы для границы, тогда как в вашем случае вас интересуют только действительные элементы. Итак, чтобы адаптироваться к вашему делу, нам нужно использовать transpose
и клип в размере первого полу окна.
Таким образом, адаптация к вашему делу, мы имели бы -
In [82]: a
Out[82]:
array([[1, 1],
[2, 2],
[3, 3],
[4, 4],
[5, 5],
[6, 6], # Made the second elem as 6 for variety
[7, 1],
[8, 2]])
In [83]: rolling_comparison(a.T, W=5).T[:3] # 3 is half window size for 5
Out[83]:
array([[ True, True],
[ True, False],
[ True, False]], dtype=bool)
Не могли бы вы, пожалуйста, приведите пример с определенным тензором (2-мерный массив, например) и желаемый результат? – Fomalhaut
Добавлен пример. –