如何对二维NumPy数组中的每个N×N块求均值
二维数组非重叠分块均值计算方案
针对你需要将二维数组按指定大小的非重叠块计算均值的需求,这里提供一种基于NumPy的高效实现方法,既适用于小规模数组(如你给出的6×4示例),也能轻松处理大规模数组(如1000×1000数组按25×25分块)。
核心思路
利用NumPy的reshape方法将原数组按块大小重构,直接对每个块的维度求均值,避免循环遍历,效率极高。
示例实现(针对你的6×4数组)
首先定义原数组:
import numpy as np array = np.array([[0, 0, 1, 0], [1, 1, 1, 1], [0, 0, 0, 0], [1, 0, 1, 0], [0, 0, 1, 1], [1, 1, 1, 1]])
然后指定块大小并计算均值:
block_size = (2, 2) rows, cols = array.shape # 计算分块后的新维度 new_rows = rows // block_size[0] new_cols = cols // block_size[1] # 重构数组并计算块均值 2x2_means = array.reshape(new_rows, block_size[0], new_cols, block_size[1]).mean(axis=(1, 3))
运行后得到的2x2_means结果为:
[[0.5 0.75] [0.25 0.25] [0.5 1. ]]
完全符合你的需求:
2x2_means[0,0]对应原数组[:2,:2]的均值((0+0+1+1)/4=0.5)2x2_means[0,1]对应原数组[:2,2:]的均值((1+0+1+1)/4=0.75)
推广到大规模数组
以1000×1000数组按25×25分块为例:
# 生成测试用大规模数组 large_array = np.random.rand(1000, 1000) block_size = (25, 25) rows, cols = large_array.shape new_rows = rows // block_size[0] new_cols = cols // block_size[1] # 计算分块均值 block_means = large_array.reshape(new_rows, block_size[0], new_cols, block_size[1]).mean(axis=(1, 3)) # 结果形状为(40,40),因为1000//25=40
处理维度无法被块大小整除的情况
如果原数组的行/列数不能被块大小整除,可以先裁剪数组到最大的可整除维度:
array = np.random.rand(1001, 1001) block_size = (25, 25) rows, cols = array.shape # 裁剪到能被块大小整除的最大尺寸 crop_rows = (rows // block_size[0]) * block_size[0] crop_cols = (cols // block_size[1]) * block_size[1] cropped_array = array[:crop_rows, :crop_cols] # 后续计算同前 new_rows = crop_rows // block_size[0] new_cols = crop_cols // block_size[1] block_means = cropped_array.reshape(new_rows, block_size[0], new_cols, block_size[1]).mean(axis=(1, 3))
内容的提问来源于stack exchange,提问作者Thomas Huitema
相关产品推荐
相关产品推荐

