diff options
author | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2020-12-26 00:43:20 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-26 00:43:20 (GMT) |
commit | 77fde8dc16dc808b9f9838af1aa1253e15cab6ad (patch) | |
tree | a49e2b572c5c6f88364bd4869337b2bfdd6a20f1 | |
parent | ba3d67c2fb04a7842741b1b6da5d67f22c579f33 (diff) | |
download | cpython-77fde8dc16dc808b9f9838af1aa1253e15cab6ad.zip cpython-77fde8dc16dc808b9f9838af1aa1253e15cab6ad.tar.gz cpython-77fde8dc16dc808b9f9838af1aa1253e15cab6ad.tar.bz2 |
Add convolve() to the itertools recipes (GH-23928)
-rw-r--r-- | Doc/library/itertools.rst | 12 |
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) |