1つのトリックは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]])
今すぐサンプルケース
を解決するには、列挙されたアプローチは、2D配列の各行に沿って動作します。それは、列単位で動作させるようにしているようです。また、境界線の境界要素である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
例を追加しました。 –