From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Sat, 26 Dec 2020 04:23:35 +0000 (-0800) Subject: Add convolve() to the itertools recipes (GH-23928) (GH-23949) X-Git-Tag: v3.9.2rc1~97 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ed48e9e2862971c2e9dcbd9a253477ec3def5e2e;p=thirdparty%2FPython%2Fcpython.git Add convolve() to the itertools recipes (GH-23928) (GH-23949) --- diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 85f4928ce84f..ff5b60d70ff4 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -769,6 +769,18 @@ which incur interpreter overhead. def dotproduct(vec1, vec2): return sum(map(operator.mul, vec1, vec2)) + def convolve(signal, kernel): + # See: https://betterexplained.com/articles/intuitive-convolution/ + # convolve(data, [0.25, 0.25, 0.25, 0.25]) --> Moving average (blur) + # convolve(data, [1, -1]) --> 1st finite difference (1st derivative) + # convolve(data, [1, -2, 1]) --> 2nd finite difference (2nd derivative) + kernel = list(reversed(kernel)) + n = len(kernel) + window = collections.deque([0] * n, maxlen=n) + for x in chain(signal, repeat(0, n-1)): + window.append(x) + yield sum(map(operator.mul, kernel, window)) + def flatten(list_of_lists): "Flatten one level of nesting" return chain.from_iterable(list_of_lists)