如何计算带自定义步长的3D数组移动平均?求替代bottleneck的函数
3D数组自定义步长移动平均的替代方案
bottleneck的move.move_mean确实不支持步长参数,针对你的需求,这里有几个高效的替代方案:
方案一:NumPy滑动窗口+步长采样(CPU端高效推荐)
利用NumPy的sliding_window_view生成滑动窗口,再按自定义步长采样后计算均值,底层基于数组stride实现,速度接近bottleneck的优化水平:
import numpy as np # 测试数据(修正原代码的数组形状语法错误) img = np.ones((10, 10, 50)) window_size = 5 stride = 5 # 自定义步长,可按需修改 # 生成沿第2轴的滑动窗口 windows = np.lib.stride_tricks.sliding_window_view(img, window_size, axis=2) # 按步长选取窗口,再在窗口维度求均值 img_new = windows[..., ::stride, :].mean(axis=-1)
如果需要和bottleneck一致的边界处理(如mode='nearest'或'wrap'),可先对原数组做边界填充,再生成滑动窗口。
方案二:卷积实现移动平均
移动平均本质是一维卷积,用scipy.ndimage.convolve可指定步长,适合需要自定义边界模式的场景:
from scipy.ndimage import convolve window_size = 5 stride = 5 # 构造均值卷积核 kernel = np.full(window_size, 1/window_size) # 扩展核的维度以匹配3D数组的轴 kernel = kernel[np.newaxis, np.newaxis, :] # 计算带步长的卷积(mode可选'valid'/'constant'/'nearest'等) img_new = convolve(img, kernel, mode='valid', stride=(1, 1, stride))
使用mode='valid'时,输出的第2轴长度为(50 - window_size) // stride + 1,和非重叠窗口的预期结果一致。
方案三:GPU加速(有硬件条件时使用)
如果数据量极大,可用CuPy替代NumPy,语法和方案一完全一致,借助GPU实现更快的计算:
import cupy as cp img = cp.ones((10, 10, 50)) window_size = 5 stride = 5 windows = cp.lib.stride_tricks.sliding_window_view(img, window_size, axis=2) img_new = windows[..., ::stride, :].mean(axis=-1) # 如需转回NumPy数组:img_new = img_new.get()
内容的提问来源于stack exchange,提问作者emely_pi
相关产品推荐
相关产品推荐

