summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <rhettinger@users.noreply.github.com>2020-12-26 00:43:20 (GMT)
committerGitHub <noreply@github.com>2020-12-26 00:43:20 (GMT)
commit77fde8dc16dc808b9f9838af1aa1253e15cab6ad (patch)
treea49e2b572c5c6f88364bd4869337b2bfdd6a20f1
parentba3d67c2fb04a7842741b1b6da5d67f22c579f33 (diff)
downloadcpython-77fde8dc16dc808b9f9838af1aa1253e15cab6ad.zip
cpython-77fde8dc16dc808b9f9838af1aa1253e15cab6ad.tar.gz
cpython-77fde8dc16dc808b9f9838af1aa1253e15cab6ad.tar.bz2
Add convolve() to the itertools recipes (GH-23928)
-rw-r--r--Doc/library/itertools.rst12
1 files changed, 12 insertions, 0 deletions
diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
index 612a66f..03416a0 100644
--- a/Doc/library/itertools.rst
+++ b/Doc/library/itertools.rst
@@ -786,6 +786,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)