numpy を使用して実装したいアルゴリズムを次に示します。
特定の 1D 配列について、スライディング ウィンドウの最大値と最小値を計算します。最初の値が指定された配列の最初の値と等しい新しい配列を作成します。後続の値ごとに、スライディング ウィンドウの最小値と最大値の間で新しい配列に挿入された前の値をクリップします。
例として、配列a=[3, 4, 5, 4, 3, 2, 3, 3]
とサイズ 3 のスライディング ウィンドウを見てみましょう。最小値と最大値は次のようになります。
min = [3, 4, 3, 2, 2, 2]
max = [5, 5, 5, 4, 3, 3]
これで、出力配列は の最初の要素から始まるa
ので、 になり3
ます。次の値として、3 (最後に挿入された値) を 4 と 5 (インデックス 1 で見つかった最小値と最大値) の間で切り取ります。結果は 4 です。次の値では、4 を 3 と 5 の間で切り取ります。それでも 4 です。したがって、最終的には次のようになります。
output = [3, 4, 4, 4, 3, 3]
コードで python for ループを使用しないようにする方法が見つかりません。これが私が今のところ持っているものです:
def second_window(array, samples):
sample_idx = samples - 1
output = np.zeros_like(array[0:-sample_idx])
start, stop = 0, len(array)
last_value = array[0]
# Sliding window is a deque of length 'samples'.
sliding_window = deque(array[start : start+sample_idx], samples)
for i in xrange( stop - start - sample_idx):
# Get the next value in sliding window. After the first loop,
# the left value gets discarded automatically.
sliding_window.append(array[start + i + sample_idx])
min_value, max_value = min(sliding_window), max(sliding_window)
# Clip the last value between sliding window min and max
last_value = min( max(last_value, min_value), max_value)
output[start + i] = last_value
return output
numpyだけでこの結果を達成することは可能でしょうか?