这是我想使用 numpy 实现的算法:
对于给定的一维数组,计算滑动窗口上的最大值和最小值。创建一个新数组,第一个值等于给定数组中的第一个值。对于每个后续值,从滑动窗口的最小值和最大值之间剪切插入新数组中的前一个值。
作为示例,让我们以数组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 来实现此结果?