Skip to content

Commit 77fde8d

Browse files
authored
Add convolve() to the itertools recipes (GH-23928)
1 parent ba3d67c commit 77fde8d

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

Doc/library/itertools.rst

+12
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,18 @@ which incur interpreter overhead.
786786
def dotproduct(vec1, vec2):
787787
return sum(map(operator.mul, vec1, vec2))
788788

789+
def convolve(signal, kernel):
790+
# See: https://betterexplained.com/articles/intuitive-convolution/
791+
# convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur)
792+
# convolve(data, [1, -1]) --> 1st finite difference (1st derivative)
793+
# convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative)
794+
kernel = list(reversed(kernel))
795+
n = len(kernel)
796+
window = collections.deque([0] * n, maxlen=n)
797+
for x in chain(signal, repeat(0, n-1)):
798+
window.append(x)
799+
yield sum(map(operator.mul, kernel, window))
800+
789801
def flatten(list_of_lists):
790802
"Flatten one level of nesting"
791803
return chain.from_iterable(list_of_lists)

0 commit comments

Comments
 (0)