使用跨步實現高效移動平均濾波器
在之前的討論中,探討了使用跨步實現計算高效的移動平均濾波器的好處。在這裡,我們進一步深入研究這個主題並提供詳細的實現。
使用步幅進行高效移動平均過濾
要使用步幅有效計算移動平均過濾器,您可以利用numpy.lib.stride_tricks 中的as_strided()函數。此函數可讓您建立模仿指定維度的移動視窗的陣列視圖。
考慮以下程式碼:
<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>
這裡,as_strided() 函數建立一個視圖將陣列視為一系列重疊窗口,每個視窗的形狀為(100 - filtsize 1, filtsize )。
捲動視窗
移動視窗,您可以使用numpy.roll() 函數:
<code class="python">for i in range(0, filtsize-1): if i > 0: b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)</code>
這會迭代地將視窗移到filtsize列,有效模擬視窗在原始數組上的移動。
計算平均值
要計算平均值,您可以簡單地將每行中的值相加,然後除以過濾器中的元素數量:
<code class="python">filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))</code>
這給你陣列中每個像素的移動平均值。
多維移動平均值
可以使用提供的rolling_window()函數擴展上述方法來處理多維移動平均值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>
此函數可讓您沿著陣列的任意軸建立移動視窗視圖。
記憶體最佳化
很重要需要注意的是,雖然跨步技巧可能很有效,但在處理多維數組時它們也會導致記憶體開銷。 scipy.ndimage.uniform_filter() 函數提供了一種替代方法,可以有效地處理多維移動平均值,並且不會產生與跨步技巧相關的記憶體開銷。
以上是如何使用跨步實現高效的移動平均濾波器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!