Skip to content

Commit ed48e9e

Browse files
Add convolve() to the itertools recipes (GH-23928) (GH-23949)
1 parent 486e70c commit ed48e9e

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

Doc/library/itertools.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,18 @@ which incur interpreter overhead.
769769
def dotproduct(vec1, vec2):
770770
return sum(map(operator.mul, vec1, vec2))
771771

772+
def convolve(signal, kernel):
773+
# See: https://betterexplained.com/articles/intuitive-convolution/
774+
# convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur)
775+
# convolve(data, [1, -1]) --> 1st finite difference (1st derivative)
776+
# convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative)
777+
kernel = list(reversed(kernel))
778+
n = len(kernel)
779+
window = collections.deque([0] * n, maxlen=n)
780+
for x in chain(signal, repeat(0, n-1)):
781+
window.append(x)
782+
yield sum(map(operator.mul, kernel, window))
783+
772784
def flatten(list_of_lists):
773785
"Flatten one level of nesting"
774786
return chain.from_iterable(list_of_lists)

0 commit comments

Comments
 (0)