Python中二维数组元素的邻域平均值计算方法
计算二维数组元素及其8邻域的平均值(最简方法)
针对你的需求,最简洁高效的方式是利用NumPy的向量化操作,完全避免手动遍历,代码量少且性能优异。
方法一:NumPy原生滑动窗口(无额外依赖)
你已经生成了带零边框的数组B,直接用np.lib.stride_tricks.sliding_window_view提取所有3×3的窗口,再求和取平均即可:
import numpy as np A = np.array([[1,2,3],[4,5,6],[7,8,9]]) x,y = A.shape n = 1 B = np.zeros((x+2*n,y+2*n),dtype=int) B[n:x+n, n:y+n] = A # 生成所有3×3的滑动窗口 windows = np.lib.stride_tricks.sliding_window_view(B, window_shape=(3,3)) # 对每个窗口求和后除以9(窗口元素总数),得到对应原数组的平均值矩阵 average_matrix = windows.sum(axis=(2,3)) / 9 print(average_matrix)
输出结果:
[[0.66666667 1. 1.33333333] [2. 3. 4. ] [3.33333333 4. 4.66666667]]
方法二:卷积平均(需SciPy)
如果可以安装SciPy库,uniform_filter方法更直观,它直接对数组做3×3窗口的均值滤波,最后截取中间区域对应原数组:
import numpy as np from scipy.ndimage import uniform_filter A = np.array([[1,2,3],[4,5,6],[7,8,9]]) x,y = A.shape n = 1 B = np.zeros((x+2*n,y+2*n),dtype=int) B[n:x+n, n:y+n] = A # 3×3窗口均值滤波,取中间x×y区域对应原数组 average_matrix = uniform_filter(B, size=3)[1:-1, 1:-1] print(average_matrix)
说明
- 两种方法都无需手动遍历每个元素,完全利用NumPy/SciPy的底层优化,比循环快几个数量级;
- 因为你已经给原数组补了零边框,边缘元素的邻域会自动包含补的0,符合需求;
- 优先推荐方法一,无需额外安装库,纯NumPy即可实现。
内容的提问来源于stack exchange,提问作者s28
相关产品推荐
相关产品推荐

