我在这个论坛上看到了一些关于应用带有移动窗口的中值滤波器的讨论,但我的应用程序有一个特殊的特性。
我有一个尺寸为750x12000x10000的 3D 数组,我需要应用一个中值滤波器来生成一个 2D 数组(12000x10000)。为此,每个中值计算都应考虑固定的邻域窗口(通常为100x100)和所有 z 轴值。矩阵中有一些零值,在计算中位数时不应考虑它们。为了处理真实数据,我使用numpy.memmap
:
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(750, 12000, 10000))
Run Code Online (Sandbox Code Playgroud)
为了处理使用 memmap 存储的真实数据,我的输入数组被细分为几个块,但为了提高我的测试速度,我将在这篇文章中使用一个减少的数组(11, 200, 300)和一个较小的窗口(11, 5, 5)或 (11, 50, 50) 并且我期望结果矩阵 (200, 300):
import numpy as np
from timeit import default_timer as timer
zsize, ysize, xsize = (11, 200, 300)
w_size = 5 #to generate a 3D window (all_z, w_size, w_size)
#w_size = 50 #to generate a 3D window (all_z, w_size, w_size) …
Run Code Online (Sandbox Code Playgroud)