无需循环高效计算矩阵中每3个连续元素的滑动和
高效实现滑动窗口求和(无循环)
给定输入数组:
import numpy as np arr = np.array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [ 2, 6, 8, 3, 5, 6, 8, 9, 1, 2]])
需要计算每行的长度为3的滑动窗口求和(即连续3个元素依次累加,窗口每次右移1位),最终得到目标结果:
result = np.array([[6, 9, 12, 15, 18, 21, 24, 27], [16, 17, 16, 14, 19, 23, 18, 12]])
方法1:使用numpy.lib.stride_tricks.sliding_window_view
这是NumPy 1.20+版本提供的专门生成滑动窗口的工具,直观且高效:
# 生成每行的滑动窗口(窗口大小3) windows = np.lib.stride_tricks.sliding_window_view(arr, window_shape=3, axis=1) # 沿窗口轴求和 result = windows.sum(axis=2)
方法2:使用numpy.convolve
利用卷积运算的特性,用全1的卷积核实现滑动求和,适配低版本NumPy:
# 定义卷积核(长度为3,全1) kernel = np.ones(3, dtype=int) # 对每行分别做卷积,模式设为'valid'只保留有效结果 result = np.array([np.convolve(row, kernel, mode='valid') for row in arr])
两种方法均无需显式循环,底层由NumPy优化的C代码实现,运算效率远高于Python原生循环。
内容的提问来源于stack exchange,提问作者Iphy Kelvin
相关产品推荐
相关产品推荐

