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

如何对二维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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:11:15