How to Implement an Efficient Moving Average Filter using Strides?

Barbara Streisand
Release: 2024-10-19 12:19:01
Original
857 people have browsed it

How to Implement an Efficient Moving Average Filter using Strides?

Using Strides for an Efficient Moving Average Filter

In a previous discussion, the benefits of using strides for computationally efficient moving average filters were explored. Here, we delve further into this topic and provide a detailed implementation.

Efficient Moving Average Filtering with Strides

To efficiently compute a moving average filter using strides, you can leverage the as_strided() function from numpy.lib.stride_tricks. This function allows you to create a view of an array that mimics a moving window of specified dimensions.

Consider the following code:

<code class="python">filtsize = 3
a = numpy.arange(100).reshape((10,10))
b = numpy.lib.stride_tricks.as_strided(a, shape=(a.size,filtsize), strides=(a.itemsize, a.itemsize))</code>
Copy after login

Here, the as_strided() function creates a view of the a array as a series of overlapping windows, each with a shape of (100 - filtsize 1, filtsize).

Rolling the Window

To move the window, you can use the numpy.roll() function:

<code class="python">for i in range(0, filtsize-1):
    if i > 0:
        b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)</code>
Copy after login

This iteratively shifts the window by filtsize columns, effectively simulating the movement of the window over the original array.

Calculating the Average

To calculate the average, you can simply sum the values in each row and divide by the number of elements in the filter:

<code class="python">filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))</code>
Copy after login

This gives you the moving average for each pixel in the a array.

Multidimensional Moving Averages

The above approach can be extended to handle multidimensional moving averages using the rolling_window() function provided by numpy:

<code class="python">def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)</code>
Copy after login

This function allows you to create moving window views along arbitrary axes of an array.

Memory Optimization

It's important to note that while stride tricks can be efficient, they can also lead to memory overhead when dealing with multidimensional arrays. The scipy.ndimage.uniform_filter() function offers an alternative approach that handles multidimensional moving averages efficiently and without the memory overhead associated with stride tricks.

The above is the detailed content of How to Implement an Efficient Moving Average Filter using Strides?. For more information, please follow other related articles on the PHP Chinese website!

source:php
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template