【发布时间】:2018-10-03 09:33:05
【问题描述】:
我正在 Python 中开发一个移动窗口算法,该算法将用于在大型 numpy 数组中滑动(例如,我的测试数组尺寸为 6349x9849)。我需要在 25 x 25 移动窗口中计算多个不同的统计数据,该移动窗口在每个像素位置被 9x9 窗口遮盖。
还有一个警告阻止了我使用 convolve(例如,这对于计算移动窗口中的平均值非常快):如果移动窗口中的中心像素为 0,我将统计值设置为 -9999作为标志,或者如果 25x25 移动窗口包含超过一半的 0 值,我将统计值设置为 -1 作为标志。然后我可以稍后处理这些标志。
我已经编写了 Python 代码来执行此操作,但这是我在 Python 学习中第一次处理特别大量的数据,因此遇到了效率问题 - 我编写的代码需要很长时间已经写过(对于这个图像大小,每个统计大约需要 6 个小时......!)。
我想请教如何更有效地做到这一点。我想先优化代码,然后再投入更多的计算能力(我相信我可以使用多处理例如执行此操作的模块)。
我的代码,例如统计数据(标准偏差)如下。我对每个统计数据重复这一行(我有 6 个统计数据要计算):
# Calculate the standard deviation of the masked moving window
stats_std = [-9999 if ds_array[row,column] == 0
else -1 if np.count_nonzero(ds_array[row-border_buff:row+border_buff+1,column-border_buff:column+border_buff+1]) < (outer_box**2)/2
else np.std([i for i in np.ma.compressed(np.ma.masked_array(ds_array[row-border_buff:row+border_buff+1,column-border_buff:column+border_buff+1],mask)) if i!=0])
for row in range(border_buff,m-border_buff)
for column in range(border_buff,n-border_buff)]
# Reshape the list into the image dimensions
stats_std = np.reshape(stats_std,(m-2*border_buff,n-2*border_buff))
如果需要,我可以提供一个示例子集数组和所需的输出以供试用,但不确定提供此功能的最佳方式,如果需要使上述内容更清晰,请告诉我。
附:我尝试了一种将 2d 数组转换为数组所有 25x25 子集的 3d 的方法,然后在每个子集的一个步骤中有效地计算 6 个统计数据,希望能够显着节省计算量。但这导致了 MemoryError。
【问题讨论】:
标签: python arrays moving-average sliding-window