You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算带自定义步长的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:30:18