下面是一個算法我想實現使用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
。對於下一個值,我在4和5之間剪輯3(最後插入的值)(在索引1處找到最小值和最大值)。結果是4.對於下一個值,我在3和5之間剪輯4。它仍然是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才能達到這個結果嗎?
我讀到有關as_strided之前,但當我遇到其他問題時,我把它放在一邊,忘了它。很高興你能向我展示一個可行的例子。 我仍然想知道np.roll是否會有一些潛力。 – Dan737